Rails通过验证测试

时间:2016-04-01 19:10:38

标签: ruby-on-rails activerecord

我有一个模特

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 

3 个答案:

答案 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 

它应该通过。