我想在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
最让我困扰的是,每当我添加新的嵌套路线时,我都必须更新控制器。
有没有更好的方法来确定父模型? (除了简单地重构上面的代码)
答案 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 = ...