Ruby
Rails
初心者
アンチパターン

Rails ActionControllerのフィルタ機能は継承元のメソッドにも影響を与えるからこんな実装はするな

はじめに

初歩的なことなんですが、これが原因で15分くらいバグの原因が突き止められなかったので戒めも込めて書きますた。

登場人物

要素 説明
User ユーザー
Team ユーザーが属しているチーム
current_user ログインユーザー

こんな実装をしていた

各ページの共通ヘッダーにログインユーザーのチーム名を表示したい!

ApplicationController内で@my_teamを取得するset_teamを実装します。

class ApplicationController < ActionController::Base

  def set_team
    @my_team = current_user.team
  end

end

これでview側では@my_team.nameみたいな感じでチーム名を取得できます。

まあこれは何の問題もありません。

Teamの一覧画面と詳細画面を作る!

TeamsControllerを作成して、indexshowを実装します。
チーム情報を取得するロジックは今後使い回す予定があるためset_teamsset_teamを実装してbefore_actionで呼び出すことにします。

class TeamsController < ApplicationController
  before_action :set_teams, only: :index
  before_action :set_team, only: :show

  def index ;end

  def show ;end

  private

  def set_teams
    @teams = Team.all
  end

  def set_team
    @team = Team.find(params[:id])
  end
end

お分かりだろうか?

indexにアクセスするとエラーが出ることに...
そうTeamsControllerのアクションではset_teamがshowの場合にしか呼ばれないように書かれています。
これは単にTeamsControllerの中にあるset_teamにのみ当てはまるわけではないのです。
継承者とのset_teamにも影響を与えるのです。(当たり前だろって?うるさいなあ)

終わりに

名前のつけ方には気をつけないといけないなあ(小並感)

ブログで見たい方はこちら
Rails ActionControllerのフィルタ機能は継承元のメソッドにも影響を与えるからこんな実装はするな