我有以下型号:
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_catering对象在更新后有错误,如:
<{[:orderable, ["can't be blank"]]=>nil}>
但是当我通过orderable => true
时,一切都很好,没有错误。
这里有什么问题,为什么我不能设定为虚假?
答案 0 :(得分:42)
通过使用validates :orderable, :presence => true
确认布尔标志的存在没有什么意义 - 它将是true
,nil
或false
- 在Ruby世界中,nil和false具有相同的语义值它涉及布尔逻辑。
在内部,validates :presence
依赖于要检查的属性的值,以便在调用false
时返回blank?
。而且,在Rails(使用ActiveSupport)中,false.blank?
的计算结果为true
- 这意味着您的字段未通过验证。
只需删除该验证,一切都将按预期工作。
答案 1 :(得分:20)
就像Dan Cheail已经在他的回答中所说,nil
和false
布尔在语义上是相同的。
但是,如果你真的需要验证它(不允许nil
),你总是可以这样做:
validates_inclusion_of :orderable, :in => [true, false]
答案 2 :(得分:-2)
您应该使用默认值编写迁移,而不是validates :presence => :true
:
t.boolean :orderable, :default => 0
我假设您的默认值应为false
。如果true
,请使用默认值1。然后它将在数据库中设置默认值。因此,您可以省略验证检查。
@dan回答了您无法使用validates :presence
的原因。 Presence表示不为空,Rails使用.blank?
函数,false.blank?
为true