モデルのバリデーションでBoolean型の入力チェックを行う方法(Rails)
結論
Boolean型の入力チェックは
presence: true
だと出来ないinclusion:{in: [true, false]}
であれば、チェック可能
基本的な入力必須のバリデーション
Railsのモデルのバリデーションにおいて、入力必須のチェックを行う場合、presence: true
が良く用いられます。
class User < ApplicationRecord validates :name, presence: true end
これはテキスト(string型、text型など)や数値(integer型など)などであれば有効です。
しかし、Boolean型(真偽値、true/false)では、正常に機能しません。
Boolean型ではpresence: true
は正常に機能しない
Boolean型のバリデーションにpresence: true
を利用すると、false
が入った時にも、エラーで弾かれてしまいます。
これはpresence: true
が、内部でblank?
メソッドを使って、属性の有無を判別しているのが原因です。
blank?
メソッドは、オブジェクトがnil, 空文字列('', ' '), 空配列([]), 空ハッシュ ({}), false
のときtrue
を返し、1つ以上の要素があればfalse
を返すメソッドです。
つまり、false
という値が入っていたとしても、入力されていないと判定されてしまうのです。
inclusion
を利用する
Boolean型に対して入力有無のチェックを行いたい場合は、inclusion
を利用します。
inclusion
は、指定した複数の値の中に、値が含まれているかどうかを検証します。
inclusion
で、true
もしくわfalse
を指定すれば、false
であってもtrue
が返ります。
class User < ApplicationRecord validates :is_admin, inclusion: { in: [true, false] } end