2012-12-28 61 views
2

我想確定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 

在我AddressesControllerindex行動我想加載父模型,但根據匹配的路由,該參數包含父ID變化

/people/1/addresses  -> person_id 
/locations/1/addresses -> location_id 
/events/1/addresses  -> event_id 

現在我有這個醜陋的代碼在我index行動:

if params[:person_id] 
    parent_id = params[:person_id] 
    parent_type = Person 
elsif params[:location_id] 
    parent_id = params[:location_id] 
    parent_type = Location 
else params[:event_id] 
    parent_id = params[:event_id] 
    parent_type = Event 
end 

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

讓我困擾最深的是,我有每當我添加一個新的嵌套的路線來更新我的控制器。

有沒有更好的方法來確定父模型? (除了簡單地重構上面的代碼)

+1

我的方法與上面的非常相似。我希望有人能給你一個很好的答案,因爲我也很願意清理它。 – theIV

回答

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方法:設置實例變量命名爲默認。針對特定需求...

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 = ... 
+0

我給出了更廣泛的答案,因爲這是一個常見的問題。取父對象在其他操作中可能很有用。 –