3

我想配置我的 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。我迷路了——这能做到吗?

4

2 回答 2

2

您尝试做的事情会产生冲突,这就是 Rails 不允许您这样做的原因。

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

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

和:

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

因此,要回答您的问题,因为在您消除歧义之前,您无法完成您想要做的事情。

更新:

借用@sevenseacat的回答,我认为这应该做你想做的事,在路由 /bob/edit 将用户“bob”的编辑操作优先于名为“edit”的房子的显示操作的情况下:

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,这保证了在发生冲突时将获得优先权。

于 2012-10-30T14:55:25.417 回答
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
于 2012-10-30T14:55:15.667 回答