Validations(バリデーション)

Modelレベルでデータ整合性を保証

バリデーションはデータがDBに保存される前に有効性を検査する機能です。

class Post < ApplicationRecord
  validates :title, presence: true, length: { maximum: 200 }
  validates :content, presence: true
  validates :slug, uniqueness: true
  validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }
  validates :status, inclusion: { in: %w[draft published archived] }
  validate :custom_validation_method

  private

  def custom_validation_method
    if publish_date.present? && publish_date < Date.today
      errors.add(:publish_date, '過去の日付は設定できません')
    end
  end
end

検証失敗時:

  • save → falseを返す

  • save! → ActiveRecord::RecordInvalid例外

  • model.errors.full_messagesでエラーメッセージにアクセス

  • ビューで@post.errors[:title]でフィールドごとのエラー表示

キーポイント

1

validates :field, オプションマクロで検証ルール宣言

2

presence: true — 空値不可

3

uniqueness: true — 重複不可(DBインデックス追加推奨)

4

length: { minimum: 1, maximum: 200 } — 長さ制限

5

save/create呼び出し時に自動で検証実行

6

検証失敗時errorsオブジェクトにエラーメッセージ保存

メリット

  • DBレベルではなくアプリケーションレベルで検証
  • エラーメッセージ自動管理
  • カスタム検証メソッド作成可能
  • 条件付き検証サポート(if:/unless:)

デメリット

  • uniquenessはrace condition可能 → DBユニークインデックス必要
  • 複雑なビジネスルールはService Objectに分離が必要
  • skip_validationで回避可能
  • 翻訳(i18n)設定が必要な場合がある

ユースケース

必須フィールド確認(presence) メール形式検証(format) 重複防止(uniqueness) 値範囲検証(inclusion、numericality)