Rails路由和控制器参数

我有两个共享相同控制器的资源。 到目前为止,我的方法是使用特殊的类型参数进行路由:

resources :bazs do resources :foos, controller: :foos, type: :Foo resources :bars, controller: :foos, type: :Bar end 

路线按预期工作,但我的所有链接都是这样的:

 /bazs/1/foos/new?type=Foo /bazs/1/bars/new?type=Bar 

代替

 /bazs/1/foos/new /bazs/1/bars/new 

如何在不弄乱链接的情况下将参数传递给控制器​​?

尝试这样的事情:

 resources :bazs do get ':type/new', to: 'foos#new' end 

对于需要2个ID的动词,

 resources :bazs do get ':type/:id', to: 'foos#show', on: :member end 

然后你有params [:bazs_id]和params [:id]。

你也可以这样做:

 resources :bazs do member do get ':type/new', to: 'foos#new' get ':type/:id', to: 'foos#show' end end 

为了永远有params [:bazs_id]。

对于您提到的根级别冲突,您可以执行以下操作:

 constraints(type: /foos|bars/) do get ':type/new', to: 'foos#new' get ':type/:id', to: 'foos#show' end 

在您的路由中, type:是设置附加在URI上的参数type 。 对于每个路由,另一个选项可以是定义defaults ,这些参数只能由控制器访问,而不会出现在URI中。

关于默认值的文档很好地解释了这一点。

例:

 resources :bazs do resources :foos, controller: :foos resources :bars, controller: :foos end