30

私は次のモデルを持っています:

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と、すべてが正常でエラーはありません。

ここで何が問題になっていますか、なぜorderableをfalseに設定できないのですか?

4

3 に答える 3

43

あなたのモデルは、実際にはあなたが言った通りに振る舞っています。validates :orderable, :presence => true

ブールフラグの存在を検証する意味はほとんどありません-それはtruenilまたはになりますfalse-そしてRubyの世界では、ブール論理に関しては、nilとfalseは同じセマンティック値を持ちます。

内部的には、が呼び出されたときvalidates :presenceに返されるようにチェックされている属性の値に依存します。また、Rails(ActiveSupportを使用)では、 -と評価されます。これは、フィールドが検証に失敗していることを意味します。falseblank?false.blank?true

その検証を削除するだけで、すべてが期待どおりに機能します。

于 2011-03-07T11:59:05.257 に答える
21

Dan Cheailがすでに彼の答えで言ったように、anilfalsebooleanは意味的に同じものです。

ただし、本当に検証する必要がある場合(許可しないnil場合)は、いつでも実行できます。

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

于 2012-12-06T11:08:09.967 に答える
-2

の代わりにvalidates :presence => :true、次のようなデフォルト値を使用して移行を記述する必要があります。

t.boolean :orderable, :default => 0

デフォルト値はであると思いますfalse。の場合true、デフォルトとして1を使用します。次に、データベースにデフォルト値を設定します。したがって、検証チェックを省略できます。

使用できない理由validates :presenceは@danが回答します。プレゼンスは空白ではないことを意味し、Railsはこれに関数を使用します.blank?false.blank?true

于 2011-03-07T12:19:20.930 に答える