良い方法
numericality
以下に色々書いたが↑の方法の方が良い。
シンプルに対応できる。
最初に書いていた方法
前提
- 異常な値が入力されたときにバリデーションしたい
- データ型が違う値が送られてきてもバリデーションしたい
- 年齢を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/ }
でバリデーションに引っかかってエラーを返してくれる。