【问题标题】:Rails 3 Routing: Resource actions and nested resource with :path => "/"Rails 3 Routing:资源操作和嵌套资源:path =>“/”
【发布时间】:2012-10-30 23:17:39
【问题描述】:

我想配置我的 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)发生冲突。我迷路了 - 可以这样做吗?

【问题讨论】:

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


    【解决方案1】:

    您尝试做的事情会产生冲突,这就是 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 路径,这保证了在发生冲突时它会获得优先权。

    【讨论】:

    • 谢谢,很好用。最初尝试此操作时,我搞砸了我的订购...现在它按预期工作。
    【解决方案2】:

    这样的事情可能就是你所追求的:

    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
    

    【讨论】:

    • 这会将任何编辑请求 (/bob/edit) 路由到名为“edit”的房子的 show 操作,而不是名为“bob”的用户的编辑操作。
    • 查看我的更新答案。自从我借用它后就对此表示赞同。
    猜你喜欢
    • 2012-09-29
    • 2012-02-09
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多