【问题标题】:Rails presence validation fails on value 0Rails 存在验证在值 0 上失败
【发布时间】:2012-10-24 22:38:54
【问题描述】:

我有一个类似下面的模型,

class Activity < ActiveRecord::Base
    attr_accessible :name, :admin

    validates :name, :presence => true
    validates :admin, :presence => true
end 

name 属性是一个字符串,admin 属性在迁移中定义为布尔值。

如果我尝试在控制台中使用创建模型的实例,

a = Activity.create(:name => 'Test', :admin => 0)

然后验证失败,说我需要为管理员提供一个值。为什么?我提供了一个值。

如果我根本没有提供值,或者我提供了 nil,我可以理解。但是为什么像 0(或者甚至是 false)这样的值会导致验证失败?

【问题讨论】:

    标签: ruby-on-rails validation


    【解决方案1】:

    导轨 4/5

    validates :name, absence: true
    

    【讨论】:

      【解决方案2】:

      validates :presence 使用blank? 来确定值是否存在。但是false.blank? => 是的。所以验证失败,因为blank? 告诉 ActiveRecord 没有值存在。

      您可以将其重写为:

      validates :field_name, :inclusion =&gt; { :in =&gt; [true, false] }

      Rails Guides: ActiveRecord Validations推荐的那样

      另见A concise explanation of nil v. empty v. blank in Ruby on Rails

      【讨论】:

      • 我猜对我来说很有意义。但我想我还是不同意这个 false.blank?还是0.blank?应该返回 true
      • 很公平,但你必须与编写 Rails 的人一起讨论这个问题:)
      • +1。该解决方案有效。但我也希望 Rails 能更好地处理这个问题。在这里使用解决方案时的错误消息是:upgraded_kitchen_bathrooms=&gt;["is not included in the list"],考虑到我们所追求的简单性,这太可怕了。
      • 嗯,很容易解决我对错误消息的投诉:stackoverflow.com/a/7011116/135101
      • 我同意 false.blank?不等于“是否存在价值?”感谢发帖,终于明白了!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多