如何强制自定义 Rails 路由使用 :id 而不是 :<model>_id

And*_* R. 3 routes ruby-on-rails custom-routes

我在routes.rb中定义了以下自定义Rails路由:

resources :projects do
    get 'members' 
end
Run Code Online (Sandbox Code Playgroud)

这会产生以下路由(来自 rake 路由的输出):

project_members GET        /projects/:project_id/members(.:format)
Run Code Online (Sandbox Code Playgroud)

不过,我想要的是映射到此的路线(将 :project_id 更改为 :id)

project_members GET        /projects/:id/members(.:format)
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Mat*_*att 5

成员是嵌套资源吗?如果是这样,请将其定义为一个,并理解这就是您:project_id在路由中使用的原因,因为:id嵌套资源由最终子项使用 - 您不能让多个嵌套资源全部使用相同的变量来定义其 id。

resources :projects do 
  resources :members
end
Run Code Online (Sandbox Code Playgroud)

添加第三层嵌套,解释起来会更清楚一些:

resources :projects do 
  resources :members do
    resources :colours
  end
end
Run Code Online (Sandbox Code Playgroud)

通过这种嵌套,您可以访问控制器app/projects/:project_id/members/:member_id/colours/:id将提供的服务colours,该控制器知道:id定义了该控制器模型的实例,并且任何其他命名的 id 都属于其他资源。

否则我认为你只需将其定义为成员方法:

resources :projects do
  member do 
    get 'members'
  end
end
Run Code Online (Sandbox Code Playgroud)

这告诉路由该操作members是属于 实例的非资源操作project,我认为这应该可以解决您的问题,但请确保这是正确的做法。

请参见从外向内的 Rails 布线第 2.10节

  • 抱歉,这很令人困惑,因为“member”关键字恰好与操作同名。但是,是的,它有效。谢谢你! (2认同)