Edited at

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

More than 1 year has passed since last update.


はじめに

初歩的なことなんですが、これが原因で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のフィルタ機能は継承元のメソッドにも影響を与えるからこんな実装はするな