【问题标题】:ActiveRecord boolean validation accepting non-boolean values接受非布尔值的 ActiveRecord 布尔验证
【发布时间】:2014-01-06 14:01:02
【问题描述】:

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

【问题讨论】:

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


    【解决方案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】:

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

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

    这在过去对我有用

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我刚刚这样做了,ip.errors.messages[:new_out_of_stock]nil。那么,这一定与我的特定班级有关。
      • 其他字段的错误(这就是为什么 ip.valid? 为我返回 false),但与 new_out_of_stock 无关。
      • 我已经删除了其他字段的所有验证,但它仍然不起作用。如果有用的话,我已经用我正在使用的类定义更新了这个问题。
      • 奇怪。我会在一个干净的项目中尝试一下。
      • 不,即使在新项目中也是如此。真的很奇怪,我在 Rails 4.0.2 上。你的版本是 >= 4 吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 2022-06-13
      • 2019-09-14
      • 1970-01-01
      相关资源
      最近更新 更多