30

我有以下模型:

class GuestCatering < ActiveRecord::Base

  # Validation
  validates :name, :presence => true
  validates :order_number, :presence => true
  validates :orderable, :presence => true

end

但是当我尝试使用以下代码更新现有的 GuestCatering 时:

guest_catering.update_attributes(:orderable => false)

客人餐饮变量是一个有效的 GuestCatering 对象。更新后的guest_餐饮对象有错误,如下:

<{[:orderable, ["can't be blank"]]=>nil}>

但是当我通过 a 时orderable => true,一切都很好,没有错误。

这里有什么问题,为什么我不能将 orderable 设置为 false?

4

3 回答 3

43

通过使用validates :orderable, :presence => true

验证布尔标志的存在没有什么意义——它将是truenilfalse——在 Ruby 世界中,当涉及到布尔逻辑时,nil 和 false 具有相同的语义值。

在内部,validates :presence依赖于被检查的属性的值在被调用false时返回。blank?而且,在 Rails(使用 ActiveSupport)中,false.blank?评估为true- 这意味着您的字段未通过验证。

只需删除该验证,一切都会按预期工作。

于 2011-03-07T11:59:05.257 回答
21

就像 Dan Cheail 在他的回答中已经说过的那样, anilfalseboolean 在语义上是一回事。

但是,如果你真的需要验证它(不允许nil),你总是可以这样做:

validates_inclusion_of :orderable, :in => [true, false]

于 2012-12-06T11:08:09.967 回答
-2

而不是validates :presence => :true,您应该使用默认值编写迁移,如下所示:

t.boolean :orderable, :default => 0

我假设您的默认值应该是false. 如果true,则使用 1 作为默认值。然后它将在数据库中设置默认值。因此,您可以省略验证检查。

validates :presence@dan 回答了您不能使用的原因。存在意味着不是空白,Rails.blank?为此使用功能并且false.blank?true

于 2011-03-07T12:19:20.930 回答