2

我有这两个资源共享同一个控制器。到目前为止,我的方法是使用特殊类型参数进行路由:

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

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

4

2 回答 2

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
于 2013-11-13T20:42:44.933 回答
0

在您的路线中,type:设置type附加在 URI 上的参数。另一个选项可以是,对于每个路由,定义defaults,这将是参数只能由控制器访问,而不是出现在 URI 中。

默认值的文档很好地解释了这一点。

例子:

resources :bazs do
  resources :foos, controller: :foos
  resources :bars, controller: :foos
end
于 2013-11-13T20:21:10.417 回答