没有路由匹配[POST]表单不起作用

时间:2017-12-10 21:54:13

标签: ruby-on-rails ruby-on-rails-4

我在create_admin.html.erb中有以下内容,位于view/create_admin

目录中
<div id="page_wrapper">
    <p>Please insert the usernumber of the user that you want to make admin</p>
    <%= form_tag "/controllers/create_admin_controller" do %>
      <%= text_field_tag "account" %> <br/> <br/>
      <%= submit_tag "Make admin" %>
    <% end %>         
</div>

create_admin_controller.rb中,我有以下内容:

def update 
end

routes.rb我有以下内容:

 match "/app/views/createAdmin/create_admin.html.erb" => "create_admin#create_admin", :via => :post, :as => :update

然而我收到路由错误

  

没有路由匹配[POST]&#34; / controllers / create_admin_controller&#34;

我做错了什么?

感谢您的时间

1 个答案:

答案 0 :(得分:1)

如果您在我们的控制台中运行rake routes,您会看到这一点(在routes.rb中):

match "/app/views/createAdmin/create_admin.html.erb" => "create_admin#create_admin", :via => :post, :as => :update

生成这个:

update POST /app/views/createAdmin/create_admin.html.erb(.:format) create_admin#create_admin

as: :update部分为您的路线生成了一个名称,您可以在此处看到:

update POST /app/views/createAdmin/create_admin.html.erb(.:format) create_admin#create_admin
^^^^^^

但是你这样做了:

<%= form_tag "/controllers/create_admin_controller" do %>
  ...
<% end %>

试图提交(因为那是你告诉它的):

POST "/controllers/create_admin_controller"

你自然会得到错误,因为你没有定义那条路线,是吗?

相反,如果你这样做(在routes.rb中):

post 'create_admin/create_admin', to: 'create_admin#create_admin', as: :create_admin

并运行rake routes(在你的控制台中),你会看到:

create_admin POST   /create_admin/create_admin(.:format)  create_admin#create_admin

这部分:

create_admin POST   /create_admin/create_admin(.:format)  create_admin#create_admin
^^^^^^^^^^^^

是您指定的路线。所以,你可以这样做:

<%= form_tag create_admin_path do %>
  ...
<% end %>

然后会提交​​到create_admin的{​​{1}}操作。

顺便说一下:

CreateAdminController

完全错误,表明对路由定义的基本误解。视图的文件位置与定义路径的有关。然而,这就是您匹配的内容,即视图的文件位置。而且,您不应该有一个名为match "/app/views/createAdmin/create_admin.html.erb" => "create_admin#create_admin", :via => :post, :as => :update ^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ 的目录。它应该被称为createAdmin。因为您声明您的控制器文件是create_admin

同样,这:

create_admin_controller.rb

也是完全错误的,表明对如何形成有效网址的基本误解。如果您要手动提供网址,则应采用<%= form_tag "/controllers/create_admin_controller" do %> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 的形式。像:

controller_name/controller_action

但是,再次,为什么不使用你已经命名的路线?我的意思是,你经历了以下问题:'更新&#39;给它一个名字。使用名称!像这样:

<%= form_tag "create_admin/create_admin" do %>

(您将<%= form_tag update_path do %> 附加到_path中显示的名称的末尾,以获取有效的命名路径。)

最后,我不知道你为什么要命名一个控制器rake routes,然后给它一个名为CreateAdminController的动作。相反,如果您有一个名为create_admin的控制器,然后在AdminsController中执行了操作:

routes.rb

然后,如果您运行resources :admins (在您的控制台中),您会看到:

rake routes

现在你可以这样做:

    admins GET    /admins(.:format)             admins#index   
           POST   /admins(.:format)             admins#create
 new_admin GET    /admins/new(.:format)         admins#new
edit_admin GET    /admins/:id/edit(.:format)    admins#edit
     admin GET    /admins/:id(.:format)         admins#show
           PATCH  /admins/:id(.:format)         admins#update
           PUT    /admins/:id(.:format)         admins#update
           DELETE /admins/:id(.:format)         admins#destroy

这将发布到<%= form_tag admins_path do %> 的{​​{1}}操作。

这将更加传统。

就个人而言,我从不使用脚手架发电机。但是,如果你刚刚开始,你可能会考虑这样做,以避免你犯的所有错误。您还应该阅读ruby style guide。并购买一些书籍并做一些教程。