保存后验证Rails模型?

时间:2009-10-12 15:20:45

标签: ruby-on-rails activerecord

我有一个带有几个accepts_nested_attributes_for的模型。在保存和移动时,要求我至少拥有每个嵌套属性中的一个。

但是,验证会在保存之前进行,因此当我删除某个项目并继续前进时,它就会通过它。

如何验证保存时,我在每个嵌套类型中至少有一个项目?

3 个答案:

答案 0 :(得分:6)

accepts_nested_attributes_for存在错误。这意味着在父模型中进行验证时,您必须更加狡猾。

您可以在每个嵌套模型中使用:after_save回调来检查它是否是最后一个。但是如果你想要确保至少有一个嵌套关联很多,那就不是很干了。

然而,这是链接错误的有效解决方法:

class Whatever < ActiveRecord::Base
  :has_many => :association_a
  :has_many => :association_b

  def ensure_minimum_associations
    bad_associations =  [:association_a, :association_b].
      select{|assoc| self.send(assoc).all?{|a| a.marked_for_destruction?}}
    unless bad_associations.empty?
      bad_associations.each do |association|
        errors.add_to_base "Each #{self.class.name.downcase} must retain at least one #{association}"
      end
      return false
    end
  end
end

答案 1 :(得分:0)

您始终可以在模型上调用valid?,它将运行验证。

答案 2 :(得分:0)

我相信你正在寻找validates_associated