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

时间:2010-06-28 04:50:14

标签: 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 responded to show. Actions: create, destroy, index, manage, and update):

以下是相关部分的代码段

users / index.html.erb (创建用于转到管理部分的链接,即'/ users / manage'):

<%= link_to('New User', :action => 'manage') %>

users_controller.rb (应该接收“管理”操作,但在电话上方显示'显示':

def index
    @users = User.all

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @users }
    end
  end

  def manage
      @users = User.all
      @user = User.find(params[:id]) if params[:id]
    @user = User.new if @user.nil?

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @user }
    end
  end

Ruby / rails将'/ users / manage'视为':controller /:action /:id''users / show / 1' 即可。

当使用'/ users / manage / 1'编辑单个用户时,通过UsersController'manage'功能加载正确的:action(作为'manage'),并显示所有内容从manage.html.erb文件进行编辑。在他的情况下,UsersController正确地看到'manage'而不是'show',但仅仅是因为:传递了id,使':controller /:action /:id'路由启动并工作。

'用户/管理',:控制器/:操作似乎是问题无法将'manage'视为有效:仅限操作,而是发送是'show'中的:id ...

的routes.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

有人可以帮我解决这个问题吗?

为什么'show'动作会自动进行?我可以强制路由中的“用户”和“管理”在控制器中被识别为“管理”而不是“显示”吗?

感谢帮助人们:)

和平。

修改佣金路线

$ 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) 

4 个答案:

答案 0 :(得分:6)

您实际上从未实际映射过“管理”操作。您 但是通过map.resources:users来映射/用户,/ users /:id,/ users /:id / edit以及更多(post,put,delete)路由。检查您的rake routes,了解您的确切映射。

根据您的问题,在您的情况下,您可以按如下方式添加到用户资源的路由:

map.resources :users, :collection => {:manage => :get}

这将为您的操作添加/ users / manage GET路由。您可以通过这种方式添加:member(s)或:collection(s)。不同之处在于成员将期望提供:id,而收集则不会。

阅读rails路线指南中的更多内容:http://guides.rubyonrails.org/routing.html

正确的方式

您可能要做的是创建一个管理员namespace来管理用户。然后您的用户可以通过/ admin / users,/ admin / users /:id,/ admin / users /:id / edit等进行访问。这样,您可以将管理用户的界面与用户界面分开。用户正在编辑自己的个人资料。这是一种更好的做法,因为这样您就不需要提出像/ users / manage这样的自定义路由。它将为管理提供CRUD区域,与用户自己的CRUD区域无关。

答案 1 :(得分:2)

您可以为控制器的其他GET类型操作添加如下路线 -

resources :users do
    collection do
      get 'manage'
    end
end

答案 2 :(得分:0)

如果要重命名路由,请在路由中使用:path_names hash。

map.resources :photos, :path_names => { :new  => 'make', :edit  => 'change' } 
  

这会导致路由到   识别诸如

之类的URL
/photos/make
/photos/1/change 
     

此选项不会更改实际操作名称;   显示的两个URL仍然会路由   新的和编辑行动。

有关详细信息,请参阅本指南:http://guides.rubyonrails.org/routing.html

答案 3 :(得分:0)

我知道这是超级迟到的2020年,但是如果您无意中将路径复制到route.rb中,则会出现这种奇怪的情况。 例如: #routes.rb

resources :users
...(bunch of other routes declaration later)
resources users do
 collection do
   get :manage
end

这将导致当您尝试访问GET / users / manage时,它将进入:show操作。我在您发布的屏幕截图中看到,您的/ users路由列出了两次。这是一个指标。找到简单的resources :users并将其删除,并保留其中的更多内容,因为这是您需要的版本。