Railsのnumericalityバリデーション徹底解説!整数限定・範囲指定・allow_nilまで初心者向けにやさしく説明
生徒
「Railsで数字だけ入力させたいときは、どうすればいいんですか?」
先生
「Railsでは、モデルにバリデーションを書くことで、数字かどうかをチェックできます。」
生徒
「数字でも、整数だけとか、範囲を決めることもできますか?」
先生
「できます。numericalityという仕組みを使うと、細かい条件まで指定できます。」
1. Railsのバリデーションとnumericalityとは?
Railsのバリデーションとは、データを保存する前に「正しい内容かどうか」を確認する仕組みです。たとえば、年齢なのに文字が入っていたり、マイナスの数が入っていたら困りますよね。そのようなミスを防ぐために使います。
numericalityは、入力された値が「数字かどうか」を確認するためのバリデーションです。Rails、Active Record、モデル、バリデーションというキーワードは、Rails開発ではとてもよく使われます。
2. numericalityの基本的な書き方
まずは、numericalityの一番シンプルな使い方です。これは「数字であればOK」という意味になります。
class User < ApplicationRecord
validates :age, numericality: true
end
この例では、ageに数字以外が入ると保存できません。パソコンに例えると、「数字専用の入力欄」を用意しているようなイメージです。
3. 整数だけを許可する整数限定の使い方
年齢や個数など、小数がありえない場合は「整数だけ」に制限したいことが多いです。その場合は、only_integerを使います。
class Product < ApplicationRecord
validates :stock, numericality: { only_integer: true }
end
これで「10」「3」などはOKですが、「3.5」のような小数はエラーになります。整数とは、小数点がない数字のことです。
4. 範囲を指定する方法(以上・以下)
numericalityでは、数字の範囲も指定できます。たとえば「0以上」「100以下」といった条件です。
class Review < ApplicationRecord
validates :score, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 100 }
end
これは、テストの点数のようなイメージです。0点未満や100点を超える数値は、現実的ではないため防ぎます。
5. allow_nilの意味と使いどころ
allow_nilは、「入力が空ならチェックしない」という意味です。まだ決まっていない数字を後から入れたい場合に使います。
class Event < ApplicationRecord
validates :capacity, numericality: { only_integer: true }, allow_nil: true
end
この場合、何も入力しなくてもエラーになりません。ただし、入力した場合は整数である必要があります。
6. よくある実用パターン(年齢・料金・在庫)
実際のRailsアプリでは、numericalityはさまざまな場面で使われます。年齢、料金、在庫数などが代表例です。
class Ticket < ApplicationRecord
validates :price, numericality: { greater_than: 0 }
end
この例では、料金が0円以下になるのを防いでいます。現実のルールを、そのままコードに落とし込めるのがRailsの強みです。
7. presenceやuniquenessとの組み合わせ
numericalityは、presenceやuniquenessと一緒に使われることも多いです。presenceは「空ではない」、uniquenessは「重複しない」という意味です。
class Member < ApplicationRecord
validates :member_number, presence: true, uniqueness: true, numericality: { only_integer: true }
end
これにより、「必ず入力されていて」「他の人と同じ番号ではなく」「整数である」ことを同時にチェックできます。
8. before_*コールバックとの関係
Railsにはコールバックという仕組みがあり、保存の前後で処理を自動実行できます。before_validationは、バリデーション前に動きます。
class User < ApplicationRecord
before_validation :set_default_age
validates :age, numericality: { only_integer: true }
private
def set_default_age
self.age ||= 20
end
end
これは「年齢が未入力なら20を入れる」という処理です。そのあとでnumericalityがチェックされるため、安全に動作します。
9. numericalityで初心者がつまずきやすいポイント
よくある間違いは、「文字列の数字」と「本当の数字」の違いです。Railsでは、フォーム入力を自動で数値に変換してくれることが多いですが、バリデーションを書くことで安心できます。
numericalityを正しく使うことで、Railsアプリ、Webアプリケーション、データベースの整合性を保つことができます。