命名嵌套路由的参数

时间:2011-10-05 19:21:38

标签: ruby-on-rails-3 routes nested-routes

resources :leagues do
  resources :schedule
end

这会产生:

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

如何保持联盟ID不会改变参数名称? 所以它将是:

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

3 个答案:

答案 0 :(得分:9)

不,请不要这样做。

这种方式的原因在于它为每个应用程序中的嵌套资源提供了一个通用接口。通过在应用程序中使其不同,您实际上会“反对Rails”。 Rails有一套严格的约定,你应该坚持。当你偏离这条道路时,事情会变得混乱。


然而,如果你确实想用脚射击,比喻说,你需要手动定义路线。以下是控制器中七个标准操作的路径:

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"

正如你所看到的,它非常难看。但是,如果你真的真的希望这样做,那就是你的方式。

答案 1 :(得分:1)

您可以在资源路由上设置“param”选项以覆盖默认的“id”参数:

resources :leagues do
  resources :schedule, param: schedule_id
end

参考Rails路由文档:http://guides.rubyonrails.org/routing.html#overriding-named-route-parameters

答案 2 :(得分: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 routes | grep /account/auth
account_auth_google GET  /account/auth/:auth_lies_id/google(.:format)

因此,更简单的解决方案是仅更改控制器以使用其创建的嵌套参数名称。