嵌套路由的命名参数

Posted

技术标签:

【中文标题】嵌套路由的命名参数【英文标题】:Naming params of nested routes 【发布时间】:2011-12-01 18:20:24 【问题描述】:
resources :leagues do
  resources :schedule
end

这会生成:

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

如何防止联赛 ID 更改参数名称? 所以它会是:

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

【问题讨论】:

【参考方案1】:

不,请不要这样做。

采用这种方式的原因是它为每个应用程序中的嵌套资源提供了一个通用接口。通过在您的应用程序中使其与众不同,您实际上是在“违背”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"

如您所见,它非常丑陋。但是,如果你真的真的想这样做,那你就会这样做。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

用 rails 4.2 测试了这个。这在过去可能有效,但我似乎无法让它再次工作。你有幸在新版本的 Rails 上完成这项工作吗?【参考方案3】:

它将 ID 附加到 nested_pa​​ram 中,这很糟糕,因为我希望我的 ID 没有单数名称。看起来他们真的不希望你只像: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)

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

【讨论】:

以上是关于嵌套路由的命名参数的主要内容,如果未能解决你的问题,请参考以下文章

使用颤振将多个参数传递给命名路由

具有路由参数和命名路由器出口的延迟加载模块

命名关键字参数,函数对象,嵌套,名称空间与作用域,闭包

Flutter 通过命名路由导航直接传递参数

Laravel:如何通过javascript加载带有动态参数的命名路由

CakePHP 中命名参数的路由配置