2013-09-26 60 views
0

在我的Rails應用程序中,我有幾個接受新對象的嵌套模型的表單。因此,例如:rails控制器/窗體 - 在哪裏構建嵌套模型?

class Maker < ActiveRecord::Base 
    has_many :cars 
    accepts_nested_attributes_for :cars 
end 

class Car < ActiveRecord::Base 
    belongs_to :maker 
end 

之前,我表明形式,雖然,我需要建立一些嵌套模型爲我製作模型,或者他們並不形式顯示。例如:

maker = Maker.new 
3.times do 
    maker.cars.build 
end 

但是這個代碼應該去哪裏?在模型中作爲自己的form_display函數,在控制器中,在裝飾器等?

回答

1

對這個問題的回答將有點基於意見。從關注點分離的角度來看,如果您已經在項目中使用了裝飾器,那麼將邏輯放在那裏比在控制器或模型中更有意義。

# maker_decorator.rb 
def cars 
    if object.new_record? && object.cars.none? 
    3.times { object.cars.build } 
    end 

    object.cars 
end 

如果你不想處理的裝飾,把邏輯控制器似乎是一種合理的方法(只要它沒有被跨越多個動作重複)。

# makers_controller.rb 
def new 
    @maker = Maker.new 
    3.times { @maker.cars.build } 
end 

我不會增加模型的代碼,因爲這是的模型和視圖的擔憂,而公然混合處理這一功能,但任何使用accepts_nested_attributes_for往往會推你這條路線。 「表單對象」避免了這個問題,儘管這可能是一個重量級的解決方案,並且目前還沒有爲這種模式建立的庫或約定(see #3 in this blog post)。