はじめに
初歩的なことなんですが、これが原因で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
を作成して、index
とshow
を実装します。
チーム情報を取得するロジックは今後使い回す予定があるためset_teams
とset_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のフィルタ機能は継承元のメソッドにも影響を与えるからこんな実装はするな