20

我正在尝试根据另一个布尔字段的值将布尔字段设置为 false。我使用 ActiveRecord 模型尝试了以下操作:

  before_save :reconcile_xvent

  def reconcile_xvent
    self.xvent_hood = false if !self.xvent_plenum?
  end

但这不起作用。现在,我的许多单元测试都失败了:

ActiveRecord::RecordNotSaved: ActiveRecord::RecordNotSaved

如果 xvent_plenum 为假,我如何将 xvent_hood 设置为假?

更新

这是有效的(其中一些来自下面的评论/答案):

before_validation :reconcile_xvent

def reconcile_xvent
  if self.xvent_hood?
    self.xvent_hood = false unless xvent_plenum?
  end
end

如果没有“if self.xvent_hood?”,我无法弄清楚如何让它工作。部分....

4

2 回答 2

26

before_save仅在验证通过后调用你需要做的是reconcile_xvent向上移动before_validation而不是before_save

如果您保留该方法,before_save将发生的事情是它认为该xvent_hood方法为空,如果您有一个检查其是否为空的验证,xvent_hood它将在before_save被调用之前失败。这可能解释了为什么你会RecordNotSaved出错。

要记住的另一件事是,如果你有一个布尔属性,你也不能使用validate_presence_of. 见http://alexanderwong.me/post/16084280769/rails-validate-presence-of-boolean-and-arrays-mongoid

于 2012-08-02T17:53:39.723 回答
18

我也遇到了这个问题,第一个代码块的问题是您将xvent_hood值分配给 false 然后由 before_save 方法返回。

按照

取消回调

如果 before_* 回调返回 false,则所有后面的回调和相关操作都将被取消。如果 after_* 回调返回 false,则后面的所有回调都将被取消。回调通常按照定义的顺序运行,但定义为模型上的方法的回调除外,这些方法最后调用。

来自http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

于 2012-10-23T04:53:18.773 回答