プログラミング勉強中の初学者の私が、理解を深めるためにRailsのbefore_actionについて学んだことをアウトプットします。
この記事でわかること
- before_action がどんな役割を持つのか
- なぜRailsで共通処理に before_action を使うのか
- 基本的な使い方
- only / except の使い分け
- よくある利用シーン
before_actionとは?
Railsのbefore_actionは、コントローラー内のアクションが実行される前に、自動で呼ばれるメソッドを指定する仕組みです。
before = 前に
action =各アクション(index,show,editなど)
つまり、アクションが動く前に「共通処理」をまとめておける便利な仕組みです。
before_actionのメリット
before_actionを使うと、コードの重複を防ぐことができます。
たとえば、
- ログインしていないユーザーはアクセスできない。
- 特定のレコードを取得する処理
- 共通で使う変数の準備
などの処理は複数のアクションで使われます。
もしbefore_actionがなければ、次のコードのように毎回処理を書く必要があります。
def index
# 認証チェック
end
def show
# 認証チェック
end
def edit
# 認証チェック
endですが、before_actionを使うことで、すべてのアクションの前に自動で実行されるようになります。
before_action :require_loginbefore_actionの基本構文
before_actionの使い方は次のとおりです。
before_action :メソッド名Railsが次のように動きます:
- before_action に指定したメソッドを実行
- その後、index / show / update などのアクションを実行
before_actionの使用例
例:ログインしていない場合はアクセス拒否
すぐにイメージしやすいのが 認証チェックです。
ほとんどのWebアプリで、
- 投稿作成にはログイン必須
- 編集は自分の投稿だけ
- 退会処理は本人のみ
のような「ログイン必須ルール」があります。
それを毎回書く代わりに before_action が活躍します。
before_action :require_loginこれだけで、全てのアクションの前で require_login が呼ばれます。
例:共通レコードの取得
例えば投稿編集ページや詳細ページでは次のコードが毎回必要になります。
@post = Post.find(params[:id])そこで before_actionを使うことで、重複するコードを1つにまとめてスッキりさせることができます。
before_action :set_post, only: [:show, :edit, :update, :destroy]例:全ページ共通の検索フォームや変数を準備
アプリのヘッダーに検索フォームを置く場合などもbefore_actionを使うことで、どのページでも共通のインスタンス変数が利用可能になります。
before_action :set_search_formbefore_action のオプション
only
特定のアクションのときだけbefore_actionを使用したい場合はonlyを使います。
before_action :set_post, only: [:show, :edit]except
特定のアクションのときだけbefore_actionを使用したくない場合はexceptを使います。
before_action :require_login, except: [:index, :show]こうすることで、
- 適切なアクションにだけ共通処理を実行する
- 不要なアクションではスキップする
ことができます。
まとめ
最後に、before_actionのポイントを整理します。
以上、before_actionについてのアウトプットでした。