2012-11-05 5 views
9

に失敗し、Railsの存在の検証は、私は次のようなモデルを持っている値が0

class Activity < ActiveRecord::Base 
    attr_accessible :name, :admin 

    validates :name, :presence => true 
    validates :admin, :presence => true 
end 

nameプロパティは、文字列とプロパティは、移行のbooleanとして定義されている管理者です。私は、

a = Activity.create(:name => 'Test', :admin => 0) 

を使用して、コンソールでモデルのインスタンスを作成しようとするとその後の検証は、私が管理のために価値を提供する必要があると言って失敗し

。どうして?私は価値を提供しました。

私は値を供給することができなかったか、またはnilを供給したかどうかを理解できました。しかし、なぜ0のような値(またはその点ではfalse)でも検証は失敗するでしょうか?

答えて

17

validates :presenceは、値が存在するかどうかを判断するためにblank?を使用します。しかし、false.blank? => true。したがって、blank?は値が存在しないことをActiveRecordに伝えているため、検証は失敗します。あなたはこれを書き換えることができ

Rails Guides: ActiveRecord Validations

で推奨されているように

validates :field_name, :inclusion => { :in => [true, false] }

A concise explanation of nil v. empty v. blank in Ruby on Rails

+0

を参照してください、私は推測する私には理にかなって。しかし、私はまだそれが間違っていることに同意しないと思う。ブランク?または0.blank? trueを返すべきです – richard

+0

十分に公正ですが、あなたはRailsを書いた人たちと一緒にそれを取る必要があります:) – zetetic

+0

+1。このソリューションは機能します。しかし、私もRailsがこれをよりうまく処理したいと考えています。ここでの解決方法を使用する際のエラーメッセージは、 ':upgraded_kitchen_bathrooms => ["はリスト "に含まれていません"]です。これは私たちの後ろの単純さを考えると恐ろしいことです。 –

0

Railsの4/5

validates :name, absence: true 
関連する問題