有一个必须设置为0而不是false的布尔值

时间:2014-09-28 09:56:32

标签: ruby-on-rails ruby-on-rails-3.2

我有一个Item对象,它有一个名为has_instore_image的布尔值,当在before_save方法中设置时,必须设置为0而不是false。有这样的原因吗?这是预期的行为吗?我使用的是Rails 3.2.19。

代码:

class Item < ActiveRecord::Base

  attr_accessible :has_instore_image

  before_save :set_has_instore_image

  def set_has_instore_image
    if self.instore_images.count>0
      self.has_instore_image=true
    else
      self.has_instore_image=0
      #self.has_instore_image=false
    end
  end

1 个答案:

答案 0 :(得分:2)

来自回调中的Rails文档:

If a before_* callback returns false, all the later callbacks and the associated action are cancelled.

因此,当回调的最后一个表达式求值为false时,会发生回调链,并且save操作失败。

你可以这样补救:

def set_has_instore_image
  if self.instore_images.count>0
    self.has_instore_image=true
  else      
    self.has_instore_image=false
  end
  true
end

事实上,结束before_*所有回复true回调定义以避免同样的问题,我们认为这是一种很好的做法。