2011-03-07 23 views
27

我有以下型号:问题传递给布尔的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,一切都很好,并没有错误。

这里怎么了,为什么我不能设置为false?

+0

试试这个:guest_catering.update_attributes(:订购=> 0) – Ashish 2011-03-07 11:40:28

+0

同样的错误出现 – LeonS 2011-03-07 11:52:10

回答

39

您的模型实际上表现完全按照你告诉它,通过你的使用validates :orderable, :presence => true

有小点验证一个布尔标志的存在 - 这将是truenilfalse - 在Ruby的世界当涉及布尔逻辑时,零和假具有相同的语义值。

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

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

+0

所以我不能验证布尔标志? – LeonS 2011-03-07 12:15:40

+3

你会如何验证它?它可以打开或关闭。如果您认为它是真实的(例如同意条款),那么您可以使用验证来强制执行它。在你的情况下,它似乎并不需要。 – 2011-03-07 12:17:40

+0

感谢这帮了我很多我在类似的困境 – 2014-12-10 00:30:56

-1

相反的validates :presence => :true,你应该像这样的默认值写你的迁移:

t.boolean :orderable, :default => 0 

我假设你的默认值应为false。如果true,则使用1作为默认值。然后它会在数据库中设置默认值。所以,你可以省略验证检查。

@dan回答您不能使用validates :presence的原因。存在意味着没有空白和Rails使用.blank?功能,这和false.blank?true

19

像丹Cheail在他的回答已经说过,一个nilfalse布尔语义上是一回事。

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

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

+0

如果你的布尔数据库列是'NOT NULL',这是正确的答案,因为这将在尝试写入记录之前验证字段。另一个答案将允许验证通过'nil',但'.save'会在列限制上出错。 – dbcb 2017-01-24 00:22:31