使用_destroy的Rails accepts_nested_attributes_for可以跳过在线验证

时间:2014-01-15 10:00:35

标签: ruby-on-rails validation ruby-on-rails-4 nested-forms

所以我有一个典型的带有accepts_nested_attributes_for的Rails模型和存在验证

(片段)

class Book < ActiveRecord::Base
  ...

  has_one :cover
  accepts_nested_attributes_for :cover, allow_destroy: true

  validate :require_cover

  def require_cover
    errors.add('', 'You must have a cover for the book.') if self.cover.blank?
  end

  ...
end

这在我创建的第一步就可以正常运行。但是当我尝试编辑它并单击封面上的删除(单击删除添加_destroy true)并保存它时,它删除了封面但是已经过了关于存在的验证。

我认为发生的事情是:

  1. tagged destroy cover
  2. 验证过程发生(认为仍有封面(但可能无法识别破坏))
  3. 有效并转到保存
  4. 保存图书和
  5. 通过
  6. 没有关于无掩护的再次验证

    我做错了吗?还有其他方法可以实现吗?或者我如何重新验证这个场景(比如,在发生了保存和销毁之后,还会有另一个验证说生成的对象现在无效)?

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法,我认为保存没有考虑那些标记为_destroy的内容。

此链接更好地描述了问题并且也得到了答案。 http://homeonrails.com/2012/10/validating-nested-associations-in-rails/

基本上他拒绝了那些被标记为毁灭的东西,并计算剩下的那些。