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

参考リンク

https://railsguides.jp/active_record_validations.html