railsのbefore_actionについて解説した記事のアイキャッチ画像。

【Rails】before_actionを理解する

プログラミング勉強中の初学者の私が、理解を深めるために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_login

before_actionの基本構文

before_actionの使い方は次のとおりです。

before_action :メソッド名

Railsが次のように動きます:

  1. before_action に指定したメソッドを実行
  2. その後、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_form

before_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 は「アクションが実行される前に自動で呼ばれるメソッド」
  • 重複コードをなくすための “共通処理置き場”
  • before_action :メソッド名 と書くだけで、各アクションの前に実行される
  • only / except を使うと、適用するアクションを限定できる

以上、before_actionについてのアウトプットでした。

-Ruby on Rails

Translate »