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

时间:2013-11-22 00:08:59

标签: ruby-on-rails routes custom-routes

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

resources :projects do
    get 'members' 
end

这导致以下路线(来自rake路线的输出):

project_members GET        /projects/:project_id/members(.:format)

但我想要的是路由映射到此(更改:project_id to:id)

project_members GET        /projects/:id/members(.:format)

我怎样才能实现这一目标?

1 个答案:

答案 0 :(得分:3)

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

resources :projects do 
  resources :members
end

添加第三级嵌套,可以更清楚地解释:

resources :projects do 
  resources :members do
    resources :colours
  end
end

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

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

resources :projects do
  member do 
    get 'members'
  end
end

这告诉路由,行为members是属于project实例的非资源行为,我认为应该将你排除在外,但要确保它是正确的。

请参阅2.10 of Rails Routing from the Outside In

部分