2012-05-08 71 views
19

在Rails模型我有一個屬性is_subscriber模型驗證,當我構造的分貝遷移到這列添加到數據庫I指定的默認值是假:Rails的數據庫的默認值和用於布爾字段

t.boolean "is_subscriber", :default => false 

我也是在這個屬性需要存在於模型中指定:

validates :is_subscriber, presence: true 

所以,當我不指定這個屬性創建一個模型實例爲什麼會出現這個錯誤?

2012-05-08T21:05:54+00:00 app[web.1]: ActiveRecord::RecordInvalid (Validation failed: Is subscriber can't be blank): 

回答

42

here

如果您想驗證一個布爾字段(其中 實際值是true和false)的情況下,你將要使用 validates_inclusion_of:FIELD_NAME,:在=> [true,false]這是由於 對象#空白的方式嗎?處理布爾值。 false.blank? #=> 真正

還是在Rails3中的方式

validates :field, :inclusion => {:in => [true, false]} 
+0

好點(表決),但我不認爲數據庫規則會導致這種情況在這種情況下成功驗證,對吧? –

+0

@SteveRowley爲什麼不呢? Rails處理類型之間的數據轉換,所以它就像一個魅力。請記住,遷移語法也被轉換爲db語法。 – Fabio

+0

感謝您的解決方案! –

1

我已經解決了這個:

validates_presence_of :is_subscriber, :if => 'is_subscriber.nil?' 
1

我認爲這是整潔的自定義驗證到這個包起來。

/app/validators/is_boolean_validator.rb

class IsBooleanValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, parameters) 
    if !parameters.in? [true,false] 
     record.errors[attribute] << 'This must be true or false.' 
    end 
    end 
end 

,那麼你必須確保通過將此加載以下至/config/application.rb

config.autoload_paths += %W["#{config.root}/app/validators/"] 

(別忘了重新啓動服務器加載此)

然後您可以更整齊地驗證

validates: :field1, field2, is_boolean: true 
相關問題