2012-03-28 86 views
2

我有一个模型主菜属于模型Vin,它本身属于模型Producteur。在创建模型时初始化子模型

在Entree创建/编辑的表单上,我希望允许用户定义父Vin和Producteur的属性以创建它们,或者如果它们存在(基于用户输入进行检索),可以检索它们。

现在我做主菜new以下和edit操作:

@entree = Entree.new 
@entree.vin = Vin.new  
@entree.vin.producteur = Producteur.new 

和使用形式fields_for帮手,而工作。但是我打算对更多模型有更多的依赖关系,所以我想让它保持干燥。我所定义的回调after_initialize在Vin的模型它执行初始化producteur:

class Vin < ActiveRecord::Base 
    after_initialize :vin_setup 

    def vin_setup 
    producteur = Producteur.new 
    end 
end 

和从控制器移除producteur.new。然而,获得新动作的错误:

未定义的方法`MODEL_NAME”的NilClass:类

的形式,说

<%= fields_for @entree.vin.producteur do |producteur| %> 

行我想这意味着after_initialize回调不会像我期望的那样工作。有什么我失踪?另外,如果我在Vin模型中定义after_initialize方法而不是定义回调,则会出现相同的错误。

回答

1

你可能需要

def vin_setup 
    self.producteur = Producteur.new 
end 

你有它的方式,要初始化一个名为producteur的局部变量。

+0

感谢,这就行了。我认为既然producteur是一个明确的关联,它就会认识到它。 – Antoine 2012-03-28 17:36:26

0

您无法注册after_initialize事件的回叫方法。您必须实施一种名为after_initialize的方法。

试试这个:

class Vin < ActiveRecord::Base 
    def after_initialize 
    self.producteur = Producteur.new if new_record? 
    end 
end