LoginSignup
3
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-25

はじめに

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

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1