【Rails】型キャストされる前の値にvalidationするのは_before_type_cast

良い方法

numericality

qiita.com

以下に色々書いたが↑の方法の方が良い。
シンプルに対応できる。

最初に書いていた方法

前提

  • 異常な値が入力されたときにバリデーションしたい
  • データ型が違う値が送られてきてもバリデーションしたい
  • 年齢を3桁の数値のみ許可したい
  • DBのカラムはint型
  • DBのdefault値は0
  • 空文字やnilは許可する

NG

validates :age, format: { with: /\A\d{3}\z/, message: "年齢の形式ではありません" }, allow_blank: true

→ 1111などは型のキャストもないので、format: { with: /\A\d{3}\z/ } で桁数オーバーのためバリデーションエラーを返してくれるが、"漢字"など送られると、型が違う値のためキャストされて0扱いになる。

OK

validates :age_before_type_cast, format: { with: /\A\d{3}\z/, message: "年齢の形式ではありません" }, allow_blank: true

→ 型キャストする前にバリデーション処理を実行するので、"漢字"など送られてきても、format: { with: /\A\d{3}\z/ } でバリデーションに引っかかってエラーを返してくれる。

参考記事

qiita.com