Ruby on rails 轨道路线和控制器参数
我有两个共享同一控制器的资源。到目前为止,我的方法是使用一个特殊类型参数进行路由:Ruby on rails 轨道路线和控制器参数,ruby-on-rails,ruby,routes,polymorphism,Ruby On Rails,Ruby,Routes,Polymorphism,我有两个共享同一控制器的资源。到目前为止,我的方法是使用一个特殊类型参数进行路由: 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 resources :b
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
resources :bazs do
get ':type/new', to: 'foos#new'
end
而不是
/bazs/1/foos/new
/bazs/1/bars/new
如何将参数传递给控制器而不扰乱链接?在路由中,
类型:
正在设置附加在URI上的参数类型。另一个选项是,对于每个路由,定义默认值
,这些参数只能由控制器访问,不能出现在URI中
这本书对此解释得很好
例如:
resources :bazs do
resources :foos, controller: :foos
resources :bars, controller: :foos
end
试着这样做:
/bazs/1/foos/new?type=Foo
/bazs/1/bars/new?type=Bar
resources :bazs do
get ':type/new', to: 'foos#new'
end
对于需要2个ID的动词
resources :bazs do
get ':type/:id', to: 'foos#show', on: :member
end
然后您有两个参数[:bazz_id]和参数[:id]
您还可以执行以下操作:
resources :bazs do
member do
get ':type/new', to: 'foos#new'
get ':type/:id', to: 'foos#show'
end
end
为了始终具有参数[:bazz_id]
对于您提到的根级别冲突,您可以执行以下操作:
constraints(type: /foos|bars/) do
get ':type/new', to: 'foos#new'
get ':type/:id', to: 'foos#show'
end
这也不起作用。只是得到了相同的结果。您希望看到什么?/bazs/1/foos/new
和/bazs/1/bar/new
查看我的编辑。您根本不需要键入
或默认值
。我可以这样做,但我必须手动写入每个路由=o(另外,这可能会弄乱我已有的其他路由。@rogi我想您必须手动编写其他路由,因为您似乎不想使用:bar控制器和:bar不能被视为常规资源名称。您已有的其他路由是什么?是的,但我也必须创建一些根级别的路由。前缀为d与'bazs/1/',但当您得到'/:type/:id/*'时,问题就出现了starts@rogi在这种情况下,您可以仅在OP中保留路由,而不使用:type部分,并在:foos控制器中解析request.fullpath以获取其类型部分。