before_action完全ガイド:初心者向けにonly・except・skip_before_actionの使い方を徹底解説!
生徒
「Railsのコントローラで、共通の処理をまとめて書ける方法ってありますか?」
先生
「ありますよ。それにはbefore_actionという仕組みを使います。処理の前に自動で呼ばれるようにできます。」
生徒
「どんなときに使うんですか?ログインチェックとかですか?」
先生
「そうです。ログイン確認やデータの取得など、どのアクションでも共通して必要な処理を自動で呼ぶのに便利なんです。詳しく見ていきましょう!」
1. Railsのbefore_actionとは?
before_actionは、Railsのコントローラで使えるフィルタの一つです。フィルタとは、特定のアクション(処理)を実行する前や後に、共通処理を差し込む仕組みのことです。
before_actionは、その名前の通り「アクションが実行される前に呼ばれる処理」です。これを使うと、毎回同じコードを書かなくて済みます。
2. 基本的なbefore_actionの使い方
たとえば、全アクションの前にcheck_loginというメソッドを実行したい場合、次のように書きます。
class BooksController < ApplicationController
before_action :check_login
def index
# 本の一覧を表示
end
def show
# 本の詳細を表示
end
private
def check_login
# ログインしてなければリダイレクト
end
end
このようにbefore_actionを使うことで、indexやshowを実行する前にcheck_loginが必ず呼ばれます。
3. onlyオプションで特定のアクションだけに適用
全アクションではなく、「このアクションだけに適用したい」というときはonlyを使います。
before_action :check_login, only: [:edit, :update]
これで、editとupdateアクションの前だけでcheck_loginが実行されます。他のアクションでは実行されません。
4. exceptオプションで特定アクションを除外
逆に、「特定のアクションだけ除外したい」ときはexceptを使います。
before_action :check_login, except: [:index, :show]
この場合、indexとshowではcheck_loginが呼ばれず、それ以外のアクションでは実行されます。
5. skip_before_actionで呼び出しをスキップ
skip_before_actionは、上位の親クラス(ApplicationControllerなど)で設定されたbefore_actionを特定のコントローラで無効化したいときに使います。
class PublicPagesController < ApplicationController
skip_before_action :check_login
end
この例では、ApplicationControllerで定義されたcheck_loginが、PublicPagesControllerでは実行されなくなります。
6. 複数のbefore_actionを使う場合の注意点
before_actionは複数設定することができます。書いた順番に上から順に実行されます。
before_action :check_login
before_action :set_book
この場合、まずcheck_loginが実行され、そのあとにset_bookが呼ばれます。順番を間違えると正しく動かないこともあるので注意しましょう。
7. 実行される順番を確認してみよう
実際にログにputsで出力してみると、before_actionが先に動いているのが分かります。
class SampleController < ApplicationController
before_action :step_one
before_action :step_two
def index
puts "アクション本体"
end
private
def step_one
puts "step one"
end
def step_two
puts "step two"
end
end
step one
step two
アクション本体
このように、アクションの中身よりも先にbefore_actionが実行されていることが確認できます。
8. よくある使い方
before_actionは、以下のような共通処理によく使われます。
- ログインしているかのチェック
- ログの記録
- データの取得(例:
set_userなど) - パラメータの検証
アプリ全体で共通の処理を自動化できるので、コードの重複を防ぐことができ、保守もしやすくなります。
まとめ
before_actionの役割とRails開発での重要性
今回の記事では、Railsのコントローラで非常によく使われる before_action について、基本的な仕組みから only・except・skip_before_action の使い分けまでを詳しく解説してきました。before_actionは、アクションが実行される前に自動で処理を差し込める仕組みで、Railsらしい「共通処理をまとめる設計」を実現するための重要な機能です。ログインチェックやデータ取得、アクセス制御など、Webアプリケーションでは必ず必要になる処理を、安全かつ分かりやすく書ける点が大きな特徴です。
Rails初心者のうちは、各アクションの中に同じ処理を何度も書いてしまいがちですが、before_actionを使うことでコードの重複を防ぎ、可読性と保守性を高めることができます。Railsのコントローラ設計を理解するうえで、before_actionの考え方を身につけることは避けて通れません。
only・except・skip_before_actionの考え方
before_actionは、すべてのアクションに無条件で適用されるだけでなく、onlyやexceptを使うことで対象を細かく制御できます。onlyは「このアクションだけ実行したい場合」に使い、exceptは「このアクションだけ除外したい場合」に使います。どちらもRails開発では頻出の書き方で、特にログインが必要な画面と不要な画面を分ける場面で役立ちます。
また、ApplicationControllerなどの親クラスで定義されたbefore_actionを、特定のコントローラで無効にしたい場合には skip_before_action を使います。これにより、公開ページやログイン不要ページを柔軟に設計できるようになります。Railsの継承構造と合わせて理解することで、より実践的なコントローラ設計が可能になります。
before_actionの実行順と注意点
before_actionは複数定義することができ、上から順番に実行されます。この実行順を理解していないと、「データが取得されていない」「ログインチェックより先に別の処理が走ってしまう」といった不具合につながることがあります。Railsでは、処理の流れを意識して書くことが非常に大切です。
以下のように、処理の役割ごとにbefore_actionを分けておくと、動作が理解しやすくなります。
class BooksController < ApplicationController
before_action :check_login
before_action :set_book, only: [:show, :edit, :update]
def show
end
private
def check_login
# ログイン確認処理
end
def set_book
# データ取得処理
end
end
このように役割を分けることで、Railsらしい読みやすいコードになります。
before_actionを使いこなすためのポイント
before_actionは便利な反面、使いすぎると処理の流れが見えにくくなることもあります。そのため、「本当に共通処理かどうか」「アクション内に書いた方が分かりやすくないか」を考えながら使うことが大切です。Railsの設計では、シンプルさと分かりやすさのバランスが重要になります。
まずはログインチェックやデータ取得といった定番の使い方から慣れていき、徐々にonly・except・skip_before_actionを組み合わせて使えるようになると、Rails開発の理解が一段深まります。
生徒
「before_actionって、ただ便利な機能というだけじゃなくて、Railsの書き方そのものを表しているんですね。共通処理をまとめる理由がよく分かりました。」
先生
「そうですね。Railsでは、同じ処理を何度も書かない設計がとても大切です。before_actionは、その考え方を自然に実現できる仕組みなんですよ。」
生徒
「onlyやexceptを使えば、ログインが必要な画面と不要な画面を分けられるのも便利ですね。skip_before_actionの意味もやっと理解できました。」
先生
「理解が進んでいますね。before_actionはRailsアプリの品質を左右する重要なポイントなので、ぜひ実際にコードを書きながら慣れていきましょう。」
生徒
「これからは、共通処理を書いたら before_action にできないか考えてみます。Railsのコントローラ設計が少し楽しくなってきました。」