Ruby on rails Rails路由,自定义问题:无法识别操作,始终为';显示';

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

我尝试“管理”用户,而不是通过操作“新建”和“显示”用户。问题出在我怀疑的路由中的某个地方,因为我的链接“/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 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