4
resources :leagues do
  resources :schedule
end

これにより、次が生成されます。

leagues/:id
leagues/:league_id/schedule/:id

リーグ ID がパラメーター名を変更しないようにするにはどうすればよいですか? したがって、次のようになります。

leagues/:id
leagues/:id/schedule/:schedule_id
4

3 に答える 3

9

いいえ、しないでください。

このようになっている理由は、ネストされたリソースに対して、すべてのアプリケーションで共通のインターフェースを提供するためです。アプリケーションで異なるものにすることで、事実上、Rails の「粒度に反する」ことになります。Rails には、従うべき厳密な規則があります。この道から外れると、物事はぐちゃぐちゃになります。


ただし、比喩的に言えば、自分の足を撃ちたい場合は、ルートを手動で定義する必要があります。コントローラーの 7 つの標準アクションのルートは次のとおりです。

get 'leagues/:id/schedules', :to => "schedules#index", :as => "league_schedules"
get 'leagues/:id/schedule/:schedule_id', :to => "schedules#show", :as => "league_schedule"
get 'leagues/:id/schedules/new', :to => "schedules#new", :as => "new_league_schedule"
post 'leagues/:id/schedules', :to => "schedules#create"
get 'leagues/:id/schedule/:schedule_id/edit', :to => "schedules#edit", :as => "ed it_league_schedule"
put 'leagues/:id/schedule/:schedule_id', :to => "schedules#update"
delete 'leagues/:id/schedule/:schedule_id', :to => "schedules#destroy"

ご覧のとおり、かなり醜いです。でも、もしあなたが本当に本当にこのようにしたいのなら、それがあなたのやり方です。

于 2011-10-05T20:35:15.073 に答える
0

ID を nested_pa​​ram に追加しますが、これは残念なことです。:id競合が発生する可能性があるため、好きなだけにすることを本当に望んでいないようです。さらに、Rails が好んで使用する通常の安らかなルーティングとは少し異なります。

https://github.com/rails/rails/blob/5368f2508651c92fbae40cd679afbafdd7e98e77/actionpack/lib/action_dispatch/routing/mapper.rb#L1207

namespace :account, defaults: { type: 'account' }do
  resources :auth, param: :lies_id, only: [] do
    get :google
  end
end

Rake ルートは以下を返します

$ rake routes | grep /account/auth
account_auth_google GET  /account/auth/:auth_lies_id/google(.:format)

したがって、より簡単な解決策は、コントローラーが作成するネストされたパラメーター名を使用するようにコントローラーを変更することです。

于 2018-07-06T18:18:23.693 に答える