将布尔值传递给update_attributes的问题

Leo*_*onS 30 ruby activerecord model ruby-on-rails update-attributes

我有以下型号:

class GuestCatering < ActiveRecord::Base

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

end
Run Code Online (Sandbox Code Playgroud)

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

guest_catering.update_attributes(:orderable => false)
Run Code Online (Sandbox Code Playgroud)

来宾餐饮变量是有效的GuestCatering对象.guest_catering对象在更新后有错误,如下所示:

<{[:orderable, ["can't be blank"]]=>nil}>
Run Code Online (Sandbox Code Playgroud)

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

这里有什么问题,为什么我不能设置为虚假的?

Dan*_*ail 43

通过使用你的模型,你的模型实际上就像你告诉它的那样 validates :orderable, :presence => true

验证布尔标志的存在没有什么意义 - 它将会是true,nil或者false- 在Ruby世界中,nil和false在布尔逻辑方面具有相同的语义值.

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

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

  • 你会如何验证它?无论是打开还是关闭.如果你_need_它是真的(例如同意条款),那么你可以使用验证来强制执行它.在您的情况下,似乎并不需要. (3认同)

Raf*_*Raf 21

就像Dan Cheail已经在他的回答中所说的那样,a nilfalseboolean在语义上是相同的.

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

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