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があなたにそれをさせない理由です。

一部のユーザーボブが「編集」という名前の家を持っている状況を考えてみましょう。この場合、Railsは「/ bob / edit」をどこにルーティングすることになっていますか?2つの可能性があります:

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

と:

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

ですから、あなたの質問に答えるために、あなたがやろうとしていることは、曖昧さを取り除くまではできません。

アップデート:

@sevenseacatの回答から借りて、ルート/ bob / editの場合、「edit」という名前の家の表示アクションよりもユーザー「bob」の編集アクションを優先するルートの場合、これはあなたが望むことを行うはずだと思います。

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 に答える