Rails validates_presence_of正在检查已保存的记录而不是已编辑的记录

时间:2013-04-25 08:05:49

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

我有三个型号model1,model12和mode2。 Model1有很多模型2到模型12。

我必须验证model2到model12的存在。

当我尝试保存model1 rails的编辑记录时,保存没有model2的记录。验证仅在模型1中已存在的DB条目没有model2信息时失败。

class model1 < ActiveRecord::Base
  has_many :model12, :dependent => :destroy, :include => [:model]
  has_many :model2, :through => :model12, :uniq => true

  validates_presence_of :model12, :message => "must be present"

我试过

  validates_presence_of :model2, :message => "must be present"

这也行不通。

我想在我的情况下,某种程度上rails正在检查保存的记录而不是未保存的记录。 这就是为什么当已经保存的记录有model2和未保存的记录没有model2验证不会失败。但是当保存的记录没有model2且未保存的记录也没有model2时它会失败。

如果我的问题不明确,请告诉我。

1 个答案:

答案 0 :(得分:1)

我找到了解决问题的方法。

我在复选框中有model2s。当我取消选中所有已检查的model2并提交表单时。因为我使用的是嵌套属性,所以它标记了旧的未经检查的model2s以进行销毁,并且在此之前运行保存和验证后会发生此破坏。

所以rails发现了一些模型2,因此没有验证错误。

class model1 < ActiveRecord::Base

  has_many :model12, :dependent => :destroy, :include => [:model]
  has_many :model2, :through => :model12, :uniq => true

  accepts_nested_attributes_for :model2,
    :allow_destroy => true,
    :reject_if => proc {|m| m.blank? }

  validate :must_have_one_model2

  def must_have_one_model2
    errors.add(:model2s, 'must have one model2') if model12s_count_valid?
  end

  def model12s_count_valid?
    model12s.reject(&:marked_for_destruction?).count >= 1
  end
end

感谢les hill的帖子validation presence with nested models