Rails路由和控制器参数

时间:2013-11-13 20:15:21

标签: 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

而不是

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

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

2 个答案:

答案 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