嵌套属性中的子模型验证 - Rails

时间:2016-03-22 06:22:55

标签: ruby-on-rails ruby ruby-on-rails-4

这是我的档案:

word.rb

class Word < ActiveRecord::Base
  has_many :word_answers, dependent: :destroy
  accepts_nested_attributes_for :word_answers, allow_destroy: true,
    reject_if: lambda {|attribute| attribute[:word_id].blank?}
end

word_answer.rb

class WordAnswer < ActiveRecord::Base
  belongs_to :word
  validates :content, uniqueness: true, presence: true
end

我是否有任何方法可以在word.rb中对word_answer.rb validates :content, uniqueness: true, presence: true进行验证?

Rails 4。

我尝试了validates_associated :word_answers,但它不起作用。

我想实现的是

(1)如果我提交Word,如果没有WordAnswer则会出错。

(2)如果我提交Word,如果有BLANK WordAnswer则会出错。

(3)如果验证是WordAnswer错误,如果我提交Word将会出错。

2 个答案:

答案 0 :(得分:0)

我不认为我们是否可以将validates :content, uniqueness: true, presence: true添加到Word方法中,但您可以通过添加before_save&amp ;;来在Word模型中实现WordAnswer模型的验证。 before_update过滤器。

我想WordAnswer模型中的验证将在您在表单中使用嵌套属性时正常工作,并且它将验证正常。

在其他情况下,请解释一下您实际想要实现的目标?

答案 1 :(得分:0)

尝试以下

validate :detail

def detail
    word_answers.each do |word_answer|
        if word_answer.content.blank?
            errors.add(:"word_answer.content", "must not be blank")
            word_answer.errors.add(:content, "must not be blank")
        end
    end
end

如果模型正确关联,它应该有效。