我正在尝试验证属性是否为布尔值,即true或false。
从我预期的Rails指南
validates :new_out_of_stock, inclusion: { in: [true, false] }
工作,但它接受非布尔值(例如“Hi”)为有效:
irb> ip = ItemPrice.new
irb> ip.new_out_of_stock = "Hi"
=> "Hi"
irb> ip.valid?
=> true
irb> ip.errors.messages
=> {}
它正确拒绝nil
并接受真假。
我读过的互联网上的所有文档都说这是验证布尔属性的正确方法。为什么不起作用?
编辑:这是类定义:
class ItemPrice < ActiveRecord::Base
belongs_to :item, counter_cache: true
validates :new_out_of_stock, inclusion: { in: [true, false] }
end
答案 0 :(得分:1)
不接受非布尔值(例如“Hi”)为有效,您只需要这样做:
irb> ip.new_out_of_stock="Hi"
=> "Hi"
irb> ip.valid?
=> false # so it's not accept "Hi"
irb> ip.errors.full_messages
=> ["New_out_of_stock is not included in the list"]
irb> ip.errors.messages
=> {:new_out_of_stock=>["is not included in the list"]}
irb> ip.errors.messages[:new_out_of_stock]
=> ["is not included in the list"]
<强>更新强>
在你的模特中试试这个:
validate :require_boolean
def require_boolean
errors.add(:new_out_of_stock, "is not included in the list") unless self.new_out_of_stock.in?([true, false])
end
答案 1 :(得分:1)
我认为非布尔值在被分配给属性时被强制转换为布尔值,导致它们通过验证。
请参阅:
irb> ip.new_out_of_stock
=> nil
irb> ip.new_out_of_stock = "hi"
=> "hi"
irb> ip.new_out_of_stock
=> false
且显然false
是一个有效的布尔值,因此该字段通过。
答案 2 :(得分:0)
尝试将语法略微更改为以下
validates :new_out_of_stock, :inclusion => {:in => [true, false]}
这在过去对我有用