我有两个共享同一个控制器的资源。到目前为止,我的方法是使用特殊类型参数进行路由:
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
如何在不弄乱链接的情况下将参数传递给控制器?
答案 0 :(得分:2)
尝试这样的事情:
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
答案 1 :(得分:0)
在您的路线中,type:
正在设置参数type
,该参数会附加在URI上。对于每个路由,另一个选项可以是定义defaults
,这些参数只能由控制器访问,而不会出现在URI中。
documentation on defaults很好地解释了这一点。
示例:
resources :bazs do
resources :foos, controller: :foos
resources :bars, controller: :foos
end