Rails:ブール値であることを検証するにはどうすればよいですか?


115

レールにはvalidates_numericality_ofブール値のようなバリデーターがありますか、それとも自分でロールする必要がありますか?

回答:


244

Rails 3以降、次のことができます:

validates :field, inclusion: { in: [ true, false ] }

2
したがって、これは検証を正しく行いますが、エラーメッセージはエンドユーザーには役立ちません。「myfieldはリストに含まれていません」
Peter Sankauskas 2013年

2
いい視点ね。エラーメッセージをカスタマイズできます。guides.rubyonrails.org
Drew Dara-Abrams

55
短い形式validates :field, inclusion: [true, false]
2013年

8
validates :field, presence: trueブール値フィールドの存在()に対する通常の検証はできないことに注意してください(フィールドはfalse値に対して有効ではありません)。しかし、Rails 3とRails 4の両方でvalidates :field, inclusion: [true, false]、値のリストに含まれているかどうかをテストし、フィールドの存在をテストする副作用があります(これらの値の1つnilがもちろんない場合)。
マーティンカレル2015

1
エラーメッセージが表示されて必要な場合:validates :field, inclusion: { in: [ true, false ], message: "Please, select one!" }
タガイズム

38

私はブールフィールドのためにあなたは次のようなことをする必要があると信じています:

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

の古いバージョンから APIから:「これはObject#blank?がブール値を処理する方法が原因です。false.blank?#=> true」

これがRails 3でも問題ないかどうかはわかりませんが、お役に立てば幸いです。


笑@ Rails 3.これは今後数か月の間の警告になるでしょう。わかりました、私はこの移住がそれであると思った、そしてあなたは同意する。ありがとう!
aarona 2010

Rails 4についても同様です。うわー、false.blank?#=> trueは間違った答えのように思えますが、Railsには期待していません。
Dan Barron

1
「foo」などの文字列はに変換されるため、これは機能しませんtrue
Ka Mok

10

これを適用すると、次のようになります。

shoulda-matchersからの警告:

を使用validate_inclusion_ofして、ブール列がブール値を許可し、非ブール値を許可しないことを表明しています。ブール列はブール値以外の値をブール値に自動的に変換するため、これを完全にテストすることはできないことに注意してください。したがって、このテストを削除することを検討する必要があります。


nullが許可されているフィールドでも、nilをブール値に変換しますか?
mwfearnley 2016

列がNULL可能である場合は、この操作を行う必要がある以外ちょうど、そのテストを削除します。それは、{(nilを)allow_value必要があります.FOR(:フィールド)} リファレンス
Ardi Nusawan

4

短いバージョンを使用できます。

validates :field, inclusion: [true, false]

余分な思考。列挙型を扱うとき、私は定数も使いたいです:

KINDS = %w(opening appointment).freeze

enum kind: KINDS

validates :kind, inclusion: KINDS

2

Rails Docs 5.2.3による回答

このヘルパー(プレゼンス)は、指定された属性が空でないことを検証します。ブランクを使いますか?値がnilまたは空の文字列、つまり空であるか空白で構成される文字列であるかどうかを確認するメソッド。

false.blankから?trueの場合、ブールフィールドの存在を検証する場合は、次の検証のいずれかを使用する必要があります。

validates :boolean_field_name, inclusion: { in: [true, false] }

これは以前の回答と同じですが、更新されたドキュメントはハッシュロケットが不要になったという事実を反映しています。+1。
aarona
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.