【问题标题】:How can I validate a parent model, which uses accepts_nested_attributes_for如何验证使用accepts_nested_attributes_for 的父模型
【发布时间】:2012-07-13 00:20:40
【问题描述】:

我的 Company 模型中有一个多态关联 (contact_details),我想验证父模型。注意:我在父模型中使用了accepts_nested_attributes_for。

基本规则:

公司必须至少有一部电话(电话是那种 联系方式)

问题:

accepts_nested_attributes_for 在之后调用销毁子对象 父对象的验证

因此用户能够删除电话。当然,稍后,当用户尝试在没有手机的情况下编辑公司时,他/她会收到错误消息(The company must have at least one phone)。

公司(母公司)模型:

class Company < ActiveRecord::Base
  PHONES_NUMBER_MIN = 1

  attr_accessible :name, :contact_details_attributes, ...

  has_many :contact_details, :as => :contactable, :dependent => :destroy

  validate do |company|
    check_phones_number
  end

  accepts_nested_attributes_for :contact_details, :allow_destroy => true, :reject_if => :all_blank

  private

  def phones_number_valid?
    kind = ContactDetail::Kind.phone
    phones = contact_details.select { |cd| cd.kind_id == kind.id }
    phones.size >= PHONES_NUMBER_MIN
  end

  def check_phones_number
    unless phones_number_valid?
      errors.add(:base, :phones_too_short, :count => PHONES_NUMBER_MIN)
    end
  end

  ...
end

ContactDetail(子)模型:

class ContactDetail < ActiveRecord::Base
  attr_accessible :kind_id, :kind_value_source

  belongs_to :contactable, :polymorphic => true
  belongs_to :kind

  validates :kind_value_source, :presence => true, :length => {:maximum => 255}

  ...
end

注意:我简化了原始版本,所以你的目标很清楚。这是gist with the code。 通过使用reject_if 选项,我可以禁止删除所有电话。这可能是目前最好的选择。但我想听听你的意见。

我还找到了this question 并尝试应用答案,但并没有太大帮助。同样的问题,如上所述。我画了一个流程图,这样你就可以看到轨迹,就像我看到的那样。

在这种情况下如何验证父模型?

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • this 解决方案究竟遇到了什么问题?
  • @KL-7 相同,如上所述。我已经更新了我的问题。

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord polymorphic-associations


【解决方案1】:

从您引用的问题中,您可以去掉reject_if 并修改phones_number_valid? 中的行:

phones = contact_details.select { |cd| cd.kind_id == kind.id && !cd.marked_for_destruction? }

【讨论】:

  • 谢谢@tanzeeb-khalili!我完全坚持这一点,但你找到了可以接受的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多