ActiveRecord布尔验证接受非布尔值

时间:2013-12-18 11:47:58

标签: ruby-on-rails validation activerecord rails-activerecord

我正在尝试验证属性是否为布尔值,即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

3 个答案:

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

这在过去对我有用