我有一个模特
class Vehicule < ActiveRecord::Base
before_validation :set_principal, :if =>:new_record?
private
def set_principal
self.principal ||= !!principal
end
end
如果我测试它,当我Vehicule.new.valid?
时,它总是返回false。为什么我必须在函数中添加true
才能通过测试?
private
def set_principal
self.principal ||= !!principal
true
end
答案 0 :(得分:2)
对于初学者,失败的验证会在记录实例中填充错误对象。您可以通过运行model.errors.full_messages
来查看错误,这对于调试始终很有用。
其次,使用present?
方法测试是否存在值,而不是使用在nil上调用时返回false的笨拙!!
方法。它会使你的代码更清晰,但它也很有用,因为它可以识别&#34;空&#34;对象也是。换句话说,"".present? == false
和[].present? == false
以及{}.present? == false
nil.present? == false
等等。还有blank?
方法,它与present?
的逻辑相反。
最后,请注意使用:before_validation
回调时的返回值。与其他回调不同,如果函数返回false,它将阻止验证。
答案 1 :(得分:1)
因为不是nil =&gt;假。
在IRB:
foo = nil
!!foo => false
答案 2 :(得分:1)
如果您尝试Vehicule.new(principal: 'WORKS').valid?
def set_principal
self.principal ||= !!principal
end
它应该通过。