将布尔值传递给update_attributes的问题

时间:2011-03-07 11:32:46

标签: ruby-on-rails ruby activerecord model update-attributes

我有以下型号:

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时,一切都很好,没有错误。

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

3 个答案:

答案 0 :(得分:42)

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

,您的模型实际上与您告诉它的行为完全相同

确认布尔标志的存在没有什么意义 - 它将是truenilfalse - 在Ruby世界中,nil和false具有相同的语义值它涉及布尔逻辑。

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

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

答案 1 :(得分:20)

就像Dan Cheail已经在他的回答中所说,nilfalse布尔在语义上是相同的。

但是,如果你真的需要验证它(不允许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