Rails 3多个嵌套路由相同的控制器

时间:2011-04-01 13:16:40

标签: ruby-on-rails-3

我有两个嵌套资源,它们都使用父控制器。如何更改参数名称,以便params[:parent_id]params[:id]而不是params[:parent_id]params[:child_id]?否则无法确定我正在与哪个孩子打交道。

现在我正在映射每个单独的子路线match 'child/:child_id' => 'parent#show',但这几乎打破了DRY的所有规则,因为我有大约5条这样的路线(还有更多的路线)。

以下是我的路线示例:

resources :parent do
  resources :child1, :controller => :parent
  resources :child2, :controller => :parent
end

这是我想做的事情

resources :parent do
  resources :child1, :controller => :parent, :key => :child1_id
  resources :child2, :controller => :parent, :key => :child2_id
end

更新

我只是要重做路线,以便父母在每个孩子下面嵌套。最初没有这样做的原因是因为写这些的前同事不知道他在做什么。

此结果类似于:

resources :child1 do
  resources :parent
end

resources :child2 do
  resources :parent
end

2 个答案:

答案 0 :(得分:2)

使父项成为子项的嵌套资源似乎很奇怪。如果你真的想使用父控制器(但我不确定这是最好的方法),一种方法是保留原始路线,这感觉更自然:

resources :parent do
  resources :child1, :controller => :parent
  resources :child2, :controller => :parent
end

并且,在您的控制器中,使用request.path来区分其来源:

class ParentsController
  before_each :extract_child

  # use @child to find out which child it is...

private
  def extract_child
    request.path =~ /(child\d*)/
    @child = $1
  end
end

但坦率地说,我会问为什么不把控制逻辑放到ChildsController中,把它当成普通的Rails-y嵌套资源呢?

答案 1 :(得分:-2)

我只是要重做路线,以便父母在每个孩子下面嵌套。最初没有这样做的原因是因为写这些的前同事不知道他在做什么。

此结果类似于:

resources :child1 do
  resources :parent
end

resources :child2 do
  resources :parent
end