2011-03-07 46 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