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以获取其类型部分。