如何在索引操作中找到多态嵌套资源的父模型?

时间:2012-12-28 16:51:28

标签: ruby-on-rails ruby-on-rails-3.2 url-routing

我想在index操作中确定嵌套资源的父模型。

重要提示:我只询问index操作。在所有其他REST操作中,找到父模型很简单。此外,它已被回答了几次SO)

我有这些路线:

resources people do
  resources addresses, only: [:index]
end
resources locations do
  resources addresses, only: [:index]
end
resources events do
  resources addresses, only: [:index]
end

在我index的{​​{1}}操作中,我想加载父模型,但根据匹配的路由,包含父ID的参数 name 会发生变化:< / p>

AddressesController

现在我在/people/1/addresses -> person_id /locations/1/addresses -> location_id /events/1/addresses -> event_id 操作中有这段丑陋的代码:

index

最让我困扰的是,每当我添加新的嵌套路线时,我都必须更新控制器。

有没有更好的方法来确定父模型? (除了简单地重构上面的代码)

1 个答案:

答案 0 :(得分:3)

1方法:使用parent_type / parent_id

的情况
before_filter :polymorphic_resource

def polymorphic_resource
  request.path_parameters.each do |key, value|
    if key =~ /_id\z/
      resource_name = key.gsub(/_id\z/, "")
      @parent_type = resource_name.classify.constantize
      @parent_id = value
    end
  end
end

@addresses = Address.where(
       addressable_type: @parent_type, 
       addressable_id: @parent_id)

2方法:推荐

before_filter :polymorphic_resource

def polymorphic_resource
  request.path_parameters.each do |key, value|
    if key =~ /_id\z/
      resource_name = key.gsub(/_id\z/, "")
      @resource = resource_name.classify.constantize.find(value)
    end
  end
end

@addresses = @resource.addresses

3方法:设置名为default的实例变量。具体需求......

before_filter :polymorphic_resource

def polymorphic_resource
  request.path_parameters.each do |key, value|
    if key =~ /_id\z/
      resource_name = key.gsub(/_id\z/, "")
      instance_variable_set("@#{resource_name}", resource_name.classify.constantize.find(value))
    end
  end
end

@addresses = ...