在模型创建时初始化子模型

时间:2012-03-28 17:20:45

标签: ruby-on-rails

我有一个模型Entree属于模型Vin,它本身属于模型Producteur。

在Entree创建/编辑的表单上,我想允许用户定义父Vin和Producteur的属性来创建它们,或者如果它们存在则检索它们(根据用户输入进行检索)。

现在,我在Entree newedit操作中执行以下操作:

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

并在表单中使用fields_for帮助程序,这是有效的。但是我打算在更多的模型中有更多的依赖关系,所以我想保持干燥。我在Vin模型中定义了一个after_initialize回调,用于执行产品初始化:

class Vin < ActiveRecord::Base
  after_initialize :vin_setup

  def vin_setup
    producteur = Producteur.new
  end
end

并从控制器中删除producteur.new。但是,在新操作上出错:

  

NilClass的未定义方法`model_name':Class

表示

形式的行
<%= fields_for @entree.vin.producteur do |producteur| %>

我想这意味着after_initialize回调不会像我预期的那样动作。有什么我想念的吗?另外,如果我在Vin模型中定义after_initialize方法而不是定义回调,我会得到同样的错误。

2 个答案:

答案 0 :(得分:1)

您可能需要

def vin_setup
  self.producteur = Producteur.new
end

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

答案 1 :(得分:0)

您无法为after_initialize事件注册回调方法。您必须实现一个名为after_initialize的方法。

试试这个:

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