我在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;
我做错了什么?
感谢您的时间
答案 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。并购买一些书籍并做一些教程。