我需要验证Rails ActiveRecord对象的布尔字段。我使用了这个问题的通用解决方案:
validates :boolean_field, :inclusion => { :in => [true, false] }
但是,尽管此解决方案解决了验证false
值的问题,但它仍然允许将字符串保存到boolean_field
:
my_object.boolean_field = "string"
my_object.save # => true
my_object.boolean_field # => false
如果我将包含指定为[true, false]
,为什么会发生这种情况?更重要的是,如何验证仅真值和假值?
P.S。如果这个问题很重要,我正在使用PostgreSQL。
答案 0 :(得分:5)
您可以通过检查数据类型进行验证,您可以使用is_a?
并将数据类型的类名作为参数传递
pry(main)> a = "aaaaa"
=> "aaaaa"
pry(main)> a.is_a?(Boolean)
=> false
由于它是一个返回false
的字符串,现在尝试使用boolean
pry(main)> b = true
=> true
pry(main)> b.is_a?(Boolean)
=> true
使用此逻辑
添加自定义验证validate :check_boolean_field
def check_boolean_field
errors.add(...) unless boolean_field.is_a?(Boolean)
end