Ruby On Rails 4,在嵌套关联中动态创建嵌套关联

时间:2016-02-24 01:43:20

标签: ruby ruby-on-rails-4 associations simple-form cocoon-gem

我有3个模特

a b cddde ff 1
5
hH five lll 0
l 10
99 abcd7
9kk
0

我正在使用simple_form和cacoon来处理我的UI。 我不得不请专家在模型级别初始化地址,专家的其他明智地址不会被初始化为cacoon。

在我的控制器中,我发起了我的医生和地址

class Patient < ActiveRecord::Base
  has_one :address, as: :person
  has_many :doctors
  accepts_nested_attributes_for :address, :reject_if => :all_blank, :allow_destroy => true
  validates_associated :address
  accepts_nested_attributes_for :doctors, :reject_if => :all_blank, :allow_destroy => true
  validates_associated :doctors
end

class Doctor < ActiveRecord::Base
  after_initialize :init, unless: :persisted?
  has_one :address, as: :person
  belongs_to :patient
  accepts_nested_attributes_for :address, :reject_if => :all_blank, :allow_destroy => true
  validates_associated :address

  def init
    self.address ||= build_address
  end
end

class Address < ActiveRecord::Base
  belongs_to :person, polymorphic: true
end

但是,如果专家的地址每个输入都是空白的,我会收到一条错误消息。

  

SQLite3 :: ConstraintException:NOT NULL约束失败:addresses.line_1:INSERT INTO“地址”(“person_type”,“person_id”,“created_at”,“updated_at”)VALUES(?,?,?,?)< / p>

这是否意味着它在保存期间自动生成地址,即使

  

accepts_nested_attributes_for:address,:reject_if =&gt; :all_blank,:allow_destroy =&gt;真的

设定了?

有什么方法可以解决这个问题吗?或者有更好的方法来实现我想要的目标吗?

1 个答案:

答案 0 :(得分:2)

您不应使用init方法初始化地址。相反,您应该使用cocoon提供的:wrap_object选项(documentation)。

例如,在你的情况下会变成类似

的东西
link_to_add_association 'add doctor', f, :doctors, wrap_object: Proc.new {|doctor| doctor.build_address; doctor }