ActiveRecord布尔validation接受非布尔值

我正在尝试validation属性是否为布尔值,即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并接受真假。

我读过的所有Internet上的文档都说这是validation布尔属性的正确方法。 为什么不起作用?

编辑:这是类定义:

 class ItemPrice < ActiveRecord::Base belongs_to :item, counter_cache: true validates :new_out_of_stock, inclusion: { in: [true, false] } end 

它不接受非布尔值(例如“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 

我认为非布尔值在被分配给属性时被强制转换为布尔值,导致它们通过validation。

看到:

 irb> ip.new_out_of_stock => nil irb> ip.new_out_of_stock = "hi" => "hi" irb> ip.new_out_of_stock => false 

并且显然false是一个有效的布尔值,因此该字段通过。

尝试将语法稍微更改为以下内容

 validates :new_out_of_stock, :inclusion => {:in => [true, false]} 

这在过去对我有用