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

良い方法

numericality

【Rails】numericalityを使って属性に数値のみが使われている事を検証する - Qiita

こんばんは! validationのnumericalityヘルパーの備忘録 DBに保存されちゃう views/sample.html.erb <%= form_for @post do |f| %> <%= f.label :price %> <%= f.te...

Qiita

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

最初に書いていた方法

前提

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

参考記事

【Rails・ActiveRecord】_before_type_castを使って型が変換される前の値にバリデーションをかける - Qiita

はじめに ActiveRecordではDate型やInteger型のカラムに文字列を入れると自動でそのカラムの型に変換してくれます。 例えば以下のようなusersテーブルがあったとします。(簡単の為にcreated_atやupdated_atは省略してます。) db/s...

Qiita