2011-06-28 52 views
1

我有这样的说法对我的模型:红宝石 - 为什么这个回调函数不起作用

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,而且我的字段是布尔值。

+0

您使用的数据库是?模型中该闭合列的列定义是什么? – jaydel

+0

这是PostgreSQL!这是迁移:'add_column:questions,:closed,:布尔值' –

+0

你能为我澄清你认为是错误的吗?你似乎试图设置'关闭'的值为假,如果它是零,这是你第一次输出显示? –

回答

6

您的回调妨碍了模型的保存。从http://apidock.com/rails/ActiveRecord/Callbacks

如果 before_validation回调的返回值可以 评估,以虚假的,过程中会 中止和基地#保存将返回 假。如果Base#保存!被称为 会引发ActiveRecord :: RecordInvalid 异常。错误对象将被追加到 。

self.closednil回调返回self.closed.nil?(即false)的值,从而停止从发生的拯救。为防止出现这种情况,请确保您返回true:

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

非常感谢!合理。有效。 :) –