Rails 3路由:资源操作和嵌套资源:path => “/”

时间:2012-10-30 13:58:57

标签: ruby ruby-on-rails-3 routing

我想配置我的Rails路由,以便这些案例有效:

/username           #=> { :controller => "houses",
                    #     :action => "index",
                    #     :user_id => "username" }

/username/housename #=> { :controller => "houses",
                    #     :action => "show",
                    #     :user_id => "username",
                    #     :id => "housename" }

/username/edit      #=> { :controller => "users",
                    #     :action => "edit",
                    #     :id => "username" }

换句话说,我希望/:user_id成为常规用户资源,并拥有一个嵌套资源,直接挂载在根目录上。所以,我想要/username/housename而不是/username/houses/housename。我尝试使用:path => "/"作为嵌套资源,但这与其他操作(如`:edit)发生冲突。我迷路了 - 可以这样做吗?

2 个答案:

答案 0 :(得分:2)

你要做的事情会产生冲突,这就是Rails不让你这么做的原因。

考虑一些用户bob有一个名为“edit”的房子的情况。在这种情况下,Rails应该将'/ bob / edit'路由到哪里?有两种可能性:

{ :controller => "houses", :action => "show", :user_id => "bob", :id => "edit" }

{ :controller => "users", :action => "edit", :id => "bob" }

所以要回答你的问题,就是你要做的事情在你消除歧义之前是无法完成的。

更新:

借用@ sevenseacat的答案,我认为这应该做你想要的,在路线/ bob /编辑的情况下优先考虑用户“bob”的编辑操作,对于名为“edit”的房子的show动作:< / p>

resources :users, path: '/', only: :edit
resources :users, path: '/', only: :show do
  resources :houses, only: :show, path: ''
end

我得到这些路线:

  edit_user GET /:id/edit(.:format)     users#edit
 user_house GET /:user_id/:id(.:format) houses#show
       user GET /:id(.:format)          users#show

请注意,edit_user路径 user_house路径

答案 1 :(得分:1)

这样的事情可能就是你之后的事情:

resources :users, path: '/', only: [:show, :edit] do
  resources :houses, only: [:show], path: ''
end

rake routes告诉我:

user_house GET    /:user_id/:id(.:format)     houses#show
 edit_user GET    /:id/edit(.:format)         users#edit
           GET    /:id(.:format)              users#show