【问题标题】:Validation in Child Model in Nested Attribute - Rails嵌套属性中的子模型验证 - Rails
【发布时间】:2016-03-22 06:22:55
【问题描述】:

这是我的文件:

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 吗?

导轨 4。

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

我要实现的是

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

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

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

【问题讨论】:

  • 既然您在 word_answer 模型中执行了这些验证,为什么还需要在您的 word 模型中进行验证?
  • 因为它们是nested_attributes。它会在没有任何 word_answers 的情况下保存单词
  • 为什么要让content 独一无二?你想做什么?
  • 这就像一个问题。 Word = 问题,WordAnswer = 选择。
  • 我的意思是,你的content 应该是唯一的吗?你为什么要把你的专栏命名为内容,因为你希望它是独一无二的?想象一下?

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


【解决方案1】:

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

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

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

【讨论】:

  • 我想要实现的是(1)如果我提交Word,并且它没有WordAnswer,它会给出一个优雅的错误。 (2)如果我提交Word,它的WordAnswer为空,会报错(3)如果我在WordAnswer中添加条件,如果我提交Word,它会反映。
  • @AldrinGravides 对于存在我们可以添加前端验证,这样答案内容就不会是空白的,为了验证检查,我很快就会更新答案。
【解决方案2】:

试试下面的

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

如果您的模型关联正确,它应该可以工作。

【讨论】:

  • 另外,如果你使用nested_form
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
相关资源
最近更新 更多