scribble

吕小荣

Blog Friends RSS About

validates_presence_of 不适用于 boolean 字段

4 December, 2013

validates_presence_of 广泛的应用于 Rails model 的验证,但它不能应用于 boolean 字段。因为 false 在 validates_presence_of 眼中,是 invalid,无法通过验证!

范例

  1. 定义 confirmed 字段为 boolean,并添加 validates_presence_of 验证。

    
     Class Evaluation
          ...
          validates :confirmed, presence: {message: "请填写是否通过微信验证?”}
          ...
     end
     
  2. 使用 Rails Console 新建一个 Evaluation 对象,confirmd 字段的值设为 false

    
       [1] pry(main)> a = Evaluation.new(:confirmed => false)
       => Evaluation id: nil, 
                     sex: "female",  
                     confirmed: false
     
  3. 验证

    confirmed 的值为 fasle(不为空),但是依然无法通过 validates_presence_of 验证。

    
     [2] pry(main)> a.valid?
     => false
     [3] pry(main)> a.errors[:confirmed ]
     => [“请填写该用户是否通过了微信验证"]    
     

官方文档

查看 validates_presence_of 的官方文档可以发现这段声明:

If you want to validate the presence of a boolean field (where the real values are true and false), you will want to use validates_inclusion_of :field_name, :in => [true, false].

验证 boolean 字段,我们应该使用 validates_inclusion_of,一定要谨记哦!


Class Evaluation
  ...
  # 正确的写法1
  validates :confirmed, inclusion: {in: [true, false], message: "请填写是否通过微信验证?"}

  # 正确的写法2
  validates_inclusion_of :confirmed, in: [true, false], message: "请填写是否通过微信验证?"
  ...
end

参考资料

  1. API doc: validates_presence_of
  2. API doc: validates_inclusion_of
  3. Stackoverflow: Why does false invalidate validates_presence_of?