#はじめに
データベースでINTなどの数値型設定をしているカラムに対し、画面から全角数字を入力したとしても、半角数字に変換して通したいと言ったニーズがあった場合、numericalityのバリデーションだと文字列扱いでエラーとなってしまいます。
ユーザーの入力値を強制的に変換させ、バリデーションにかからないようにする処理を書きました。
(フロントエンド側で処理する方法もありますが、ここではモデルで解決する方法を記載しています)
app/models/item.rb
class Item < ActiveRecord::Base
validates :price, numericality: { only_integer: true }
def price=(value)
value.tr!('0-9', '0-9') if value.is_a?(String)
super(value)
end
end