Railsバリデーション入門:presence / uniqueness / length の基本と使い分け【保存版】
生徒
「Railsで入力チェックって、どうやってやるんですか?空欄を防いだり、同じデータを登録できないようにしたいです」
先生
「Railsではバリデーションという仕組みを使って、保存前にデータを確認できます」
生徒
「難しそうですが、初心者でも使えますか?」
先生
「大丈夫です。presence・uniqueness・lengthの3つを覚えるだけで、基本的な入力チェックはできます」
1. Railsのバリデーションとは何か
Railsのバリデーションとは、データベースに保存する前に「このデータは正しいか」を確認する仕組みです。たとえば、名前が空のまま保存されると、あとで誰のデータかわからなくなります。そこでRailsでは、モデルにルールを書いておくことで、正しくないデータを保存させないようにできます。
これは現実世界でいうと、申込書に「名前は必ず書いてください」「電話番号は10文字以上必要です」と注意書きがあるのと同じです。Railsはその注意書きを自動でチェックしてくれる便利な存在です。
2. presenceバリデーション:空欄を防ぐ基本ルール
presenceは「値が入っているか」を確認するバリデーションです。Rails初心者が最初に覚えるべき、とても重要なルールです。空文字やnilの場合、保存されません。
class User < ApplicationRecord
validates :name, presence: true
end
この設定をすると、nameが空のままではUserを保存できません。ログイン名、メールアドレス、タイトルなど「必須項目」に必ず使われます。
3. uniquenessバリデーション:同じ値を重複させない
uniquenessは「同じ値がすでに存在していないか」を確認するバリデーションです。ユーザー名やメールアドレスなど、重複すると困るデータで使います。
class User < ApplicationRecord
validates :email, uniqueness: true
end
これにより、同じメールアドレスを持つユーザーは登録できなくなります。SNSや会員登録サイトでは必須の設定です。
実務では、データベース側にもユニークインデックスを設定すると、より安全になります。
4. lengthバリデーション:文字数を制限する
lengthは、文字数の最小・最大を決めるバリデーションです。短すぎるパスワードや、長すぎるコメントを防ぐために使います。
class Article < ApplicationRecord
validates :title, length: { minimum: 5, maximum: 30 }
end
この例では、タイトルは5文字以上30文字以内でなければ保存できません。入力フォームの品質を保つために重要です。
5. バリデーションエラーはどう表示されるか
バリデーションに失敗すると、Railsは保存を中止し、エラーメッセージを自動で用意します。コントローラやビューから、その内容を確認できます。
user = User.new(name: "")
user.save
user.errors.full_messages
["Nameを入力してください"]
このように、人が読める日本語メッセージで理由を確認できるため、フォーム画面にもそのまま表示できます。
6. before_*コールバックで保存前に処理をする
コールバックとは、保存や更新の前後に自動で呼ばれる処理です。before_*は「〜する前」という意味で、保存前の準備によく使われます。
class User < ApplicationRecord
before_save :normalize_email
private
def normalize_email
self.email = email.downcase
end
end
この例では、保存前にメールアドレスを小文字に変換しています。入力のゆらぎを防ぎ、uniquenessバリデーションと相性が良い使い方です。
7. バリデーションとコールバックの使い分け
「正しいかどうかを確認する」のがバリデーション、「データを整える」のがコールバックです。混同しがちですが、役割は明確に分かれています。
たとえば、空欄チェックや文字数制限はバリデーション、文字の変換や初期値設定はbefore_*コールバック、と覚えると理解しやすくなります。
8. 初心者がつまずきやすいポイント
Rails初心者がよく困るのは「保存できない理由がわからない」ことです。その場合は、errors.full_messagesを確認すると原因が見えます。
また、uniquenessはデータベースの状態に依存するため、開発中はテストデータを消してから確認すると理解しやすくなります。