$ cat "dev63.hatenablog.com/entry/2022/10/07/024240.md"
// ブログエントリー — 2022/10/7

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

良い方法

numericality

[https://qiita.com/suzy1031/items/c3220a3749aec48d3d43:embed:cite]

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

最初に書いていた方法

前提

  • 異常な値が入力されたときにバリデーションしたい
  • データ型が違う値が送られてきてもバリデーションしたい
  • 年齢を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/ } でバリデーションに引っかかってエラーを返してくれる。

参考記事

[https://qiita.com/dnnnn_yu/items/4e1a0474ed047a9a92d2:embed:cite]

ENTRY: dev63.hatenablog.com/entry/2022/10/07/024240.md
DATE: 2022/10/7
WORDS: 72