✅
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)