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