Ruby - 为什么这个回调函数不起作用

时间:2011-06-28 13:31:40

标签: ruby-on-rails ruby callback

我在我的模型上有这个陈述:

class Question

    validates :closed, :inclusion => { :in => [false, true] }

    before_validation :ensure_default_data


    def ensure_default_data

        self.closed = false if self.closed.nil?

    end
end

我打电话的时候:

Question.create

它输出我:

#<Question id:nil, closed: false>

如果我将功能修改为:

def ensure_default_data
    self.closed = 0 if self.closed.nil?
end

有效!

有人对此有任何想法,为什么第一个功能不起作用?

我正在使用PostgreSQL,我的字段是布尔值。

1 个答案:

答案 0 :(得分:6)

您的回调阻止了模型的保存。来自http://apidock.com/rails/ActiveRecord/Callbacks

  

如果返回值为   before_validation可以回调   评估为假,过程将   中止,Base#save将返回   假。如果Base#save!它会被称为   提出一个ActiveRecord :: RecordInvalid   例外。什么都不会附加   错误对象。

self.closed不是nil时,您的回调会返回self.closed.nil?的值(即false),从而阻止保存发生。为防止这种情况,请确保返回true:

def ensure_default_data
  self.closed = false if self.closed.nil?
  true
end