モデルのバリデーションで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