为什么儿童模型在破坏爆炸时验证失败了accept_nested_attributes_for?

时间:2017-12-13 00:49:59

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

我们有accepts_nested_attributes_for dependent: destroy_destroy param arg配合使用。

我们在孩子身上添加了一个验证,并按预期工作。

但是当我们将两者结合起来时,父节点上的保存会抛出未处理的错误,而不是返回false。

class Foo < ActiveRecord::Base
  accepts_nested_attributes_for :bars, allow_destroy: true
  ...
end

class Bar < ActiveRecord::Base
  before_destroy :can_do?

  def can_do?
    unless yeah_sure
      errors.add(:base, I18n.t("the.translation"))
      false
    end
  end
  ...
end

两种情况下bar_spec测试yeah_sure,错误为空或存在(并且存在正确的消息)。

当我走过rails部分时,有3个级别的catch,rollback / cleanup,以及active_support和transaction中的释放。

我也尝试在控制器中进行救援,包括方法级别和开始阻止,并且这些都没有捕获错误,这很奇怪。

知道为什么foo.save会抛出错误而不是返回false?

Rails 4.2.10

1 个答案:

答案 0 :(得分:0)

您可以使用Id对嵌套属性运行验证。

此外,您可以使用inverse_of拒绝这些属性 请参阅以下link