⏱️
Before Action & Callbacks
アクション実行前後に共通ロジックを挿入する方法
Controllerコールバック(一般にFilterと呼ばれる)はアクション実行前後に特定メソッドを自動呼び出しする機能です。
種類:
before_action— アクション実行前(最も多く使用)after_action— アクション実行後around_action— アクション前後を囲む
主な使用パターン:
class PostsController < ApplicationController
before_action :authenticate_user! # 認証確認
before_action :set_post, only: [:show, :edit, :update, :destroy] # 共通データロード
before_action :authorize_post!, only: [:edit, :update, :destroy] # 権限確認
private
def set_post
@post = Post.find(params[:id])
end
end
only: / except:オプションで特定アクションにのみ適用または除外できます。skip_before_actionで継承されたコールバックをスキップすることもできます。
before_actionでredirect_toやrenderを呼ぶとチェーンが中断され、アクションは実行されません。
キーポイント
1
before_action :method_nameでコールバック登録
2
only:/except:オプションで適用範囲指定
3
アクション実行前に登録されたbefore_actionが順番に実行
4
before_actionでredirect/render時チェーン中断 → アクション実行されず
5
skip_before_actionで継承したコールバックをスキップ
6
複数のbefore_actionは登録順に実行
メリット
- ✓ 共通ロジックをDRYに管理
- ✓ 宣言的で意図が明確
- ✓ 継承による階層的コールバック管理
- ✓ アクション別の細かい制御(only/except)
デメリット
- ✗ コールバックが多いと実行順序把握が困難
- ✗ 暗黙的動作でデバッグが難しいことがある
- ✗ skip_before_actionの乱用でコード混乱
- ✗ 過度なコールバックはControllerを複雑にする
ユースケース
認証確認(authenticate_user!)
リソースロード(set_post、set_user)
権限確認(authorize!)
ロギング、監査追跡(after_action)