Ruby on rails Rails路由,自定义问题:无法识别操作,始终为';显示';
我尝试“管理”用户,而不是通过操作“新建”和“显示”用户。问题出在我怀疑的路由中的某个地方,因为我的链接“/users/manage”被接收为“show”操作的id参数: 进程的终端日志:Ruby on rails Rails路由,自定义问题:无法识别操作,始终为';显示';,ruby-on-rails,Ruby On Rails,我尝试“管理”用户,而不是通过操作“新建”和“显示”用户。问题出在我怀疑的路由中的某个地方,因为我的链接“/users/manage”被接收为“show”操作的id参数: 进程的终端日志: Processing UsersController#show (for 127.0.0.1 at 2010-06-28 00:31:45) [GET] Parameters: {"id"=>"manage"} ActionController::UnknownAction (No action
Processing UsersController#show (for 127.0.0.1 at 2010-06-28 00:31:45) [GET]
Parameters: {"id"=>"manage"}
ActionController::UnknownAction (No action responded to show. Actions: create, destroy, index, manage, and update):
以下是相关部分的一些代码片段:
users/index.html.erb(创建的链接指向管理部分,即“/users/manage”):
Ruby/rails将'/users/manage'视为一个':controller/:action/:id',即'users/show/1'
使用'/users/manage/1'编辑单个用户时,通过UsersController的“manage”功能加载适当的:操作(作为“manage”),并从manage.html.erb文件中显示要编辑的所有内容。UsersController在本例中正确地看到“manage”而不是“show”,但这仅仅是因为:id被传递,使得“:controller/:action/:id”路由生效
'users/manage',:controller/:action似乎是的问题,没有将'manage'单独识别为有效的:action,而是将其作为'show'中的:id发送。
路由。rb:
ActionController::Routing::Routes.draw do |map|
map.resources :users
map.resources :categories
map.resources :posts
map.connect ':controller/:action'
map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'
end
有人能帮我解决这个问题吗
为什么会自动采取“表演”行动?我是否可以强制将路由中的“用户”和“管理”在控制器中识别为“管理”而不是“显示”
谢谢大家的帮助:)
和平
编辑
耙路径
$ rake routes
(in /home/krnel/sites/rails_projects/simple_blog)
users GET /users(.:format) {:action=>"index", :controller=>"users"}
POST /users(.:format) {:action=>"create", :controller=>"users"}
new_user GET /users/new(.:format) {:action=>"new", :controller=>"users"}
edit_user GET /users/:id/edit(.:format) {:action=>"edit", :controller=>"users"}
user GET /users/:id(.:format) {:action=>"show", :controller=>"users"}
PUT /users/:id(.:format) {:action=>"update", :controller=>"users"}
DELETE /users/:id(.:format) {:action=>"destroy", :controller=>"users"}
categories GET /categories(.:format) {:action=>"index", :controller=>"categories"}
POST /categories(.:format) {:action=>"create", :controller=>"categories"}
new_category GET /categories/new(.:format) {:action=>"new", :controller=>"categories"}
edit_category GET /categories/:id/edit(.:format) {:action=>"edit", :controller=>"categories"}
category GET /categories/:id(.:format) {:action=>"show", :controller=>"categories"}
PUT /categories/:id(.:format) {:action=>"update", :controller=>"categories"}
DELETE /categories/:id(.:format) {:action=>"destroy", :controller=>"categories"}
posts GET /posts(.:format) {:action=>"index", :controller=>"posts"}
POST /posts(.:format) {:action=>"create", :controller=>"posts"}
new_post GET /posts/new(.:format) {:action=>"new", :controller=>"posts"}
edit_post GET /posts/:id/edit(.:format) {:action=>"edit", :controller=>"posts"}
post GET /posts/:id(.:format) {:action=>"show", :controller=>"posts"}
PUT /posts/:id(.:format) {:action=>"update", :controller=>"posts"}
DELETE /posts/:id(.:format) {:action=>"destroy", :controller=>"posts"}
manage_users GET /users/manage(.:format) {:action=>"manage", :controller=>"users"}
GET /users(.:format) {:action=>"index", :controller=>"users"}
POST /users(.:format) {:action=>"create", :controller=>"users"}
GET /users/new(.:format) {:action=>"new", :controller=>"users"}
GET /users/:id/edit(.:format) {:action=>"edit", :controller=>"users"}
GET /users/:id(.:format) {:action=>"show", :controller=>"users"}
PUT /users/:id(.:format) {:action=>"update", :controller=>"users"}
DELETE /users/:id(.:format) {:action=>"destroy", :controller=>"users"}
/:controller/:action/:id
/:controller/:action/:id(.:format)
您从来没有具体地映射“管理”操作。但是,通过执行map.resources:users,您正在映射/users、/users/:id、/users/:id/编辑和其他一些(post、put、delete)路由。检查您的
rake路由
,以了解您映射的确切内容
根据您的问题,在您的情况下,您可以按如下方式向用户资源添加路由:
map.resources :users, :collection => {:manage => :get}
这将为您的操作添加/用户/管理GET route。您可以通过这种方式添加:个成员或:个集合。不同之处在于,成员希望提供:id,而集合不需要
请阅读《rails布线指南》中的更多内容:
正确的方法
您可能想做的是创建一个管理用户的管理员。然后可以通过/admin/users、/admin/users/:id、/admin/users/:id/edit等访问您的用户。这样,您可以将管理用户的界面与用户编辑自己配置文件的界面分开。这是一个更好的实践,因为这样您就不需要像/users/manage这样定制路由。它将提供一个用于管理的CRUD区域,与用户自己的CRUD区域无关。如果要重命名路由,请在路由中使用:path\u names哈希,如下所示
map.resources :photos, :path_names => { :new => 'make', :edit => 'change' }
这将导致路由失败
识别URL,例如
/photos/make
/photos/1/change
此选项不会更改实际操作名称;
显示的两个URL仍将路由
单击“新建”和“编辑”操作
有关更多信息,请参阅本指南:您可以为控制器的其他GET类型操作添加如下路由-
resources :users do
collection do
get 'manage'
end
end
我知道现在已经很晚了,而且是2020年,但是如果你不小心在routes.rb中复制了这些路线,就会出现这种奇怪的情况。 例如: #routes.rb
resources :users
...(bunch of other routes declaration later)
resources users do
collection do
get :manage
end
这将导致当您尝试访问GET/users/manage时,它将转到:show操作。我在您发布的屏幕截图中看到,您已经列出了两次/用户路线。这是一个指标。找到简单的
resources:users
并删除它,留下一个包含更多内容的,因为它是您需要的版本。感谢快速重播:)添加了map.resources:users,:collection=>{:manage=>:get}到routes.rb,我仍然会遇到与上面相同的问题。编辑过的帖子,添加了rake路由,如果这有助于找出问题的话。Thx.确保您的map.resources:users,:collection=>{:manage=>:get}
位于任何其他用户路由声明之前。在您的代码中,看起来您正试图通过params[:id]
在manage
操作中查找用户。这意味着,您需要像/users/:id/manage这样的路由,为此,您需要使用:member=>{:manage=>:get}
而不是:collection=>
。更好地欣赏名称空间解决方案。但是,我怎样才能让它这样工作呢?这三条路线冲突吗/users/:id(:format){:action=>“show”/users/manage(:format){:action=>“manage”/users/:id(:format){:action=>“show”
resources :users do
collection do
get 'manage'
end
end
resources :users
...(bunch of other routes declaration later)
resources users do
collection do
get :manage
end