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

Est*_*has 1 ruby ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

我打电话的时候:

Question.create
Run Code Online (Sandbox Code Playgroud)

它输出我:

#<Question id:nil, closed: false>
Run Code Online (Sandbox Code Playgroud)

如果我将函数修改为:

def ensure_default_data
    self.closed = 0 if self.closed.nil?
end
Run Code Online (Sandbox Code Playgroud)

有用!

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

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

Jak*_*b S 6

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

如果before_validation回调的返回值可以被评估为false,则进程将被中止,Base#save将返回false.如果Base#save!被调用它会引发一个ActiveRecord :: RecordInvalid异常.什么都不会附加到errors对象.

如果self.closed不是nil你的回调函数返回的值self.closed.nil?(即false),从而停止从发生的拯救.要防止这种情况,请确保返回true:

def ensure_default_data
  self.closed = false if self.closed.nil?
  true
end
Run Code Online (Sandbox Code Playgroud)