読者です 読者をやめる 読者になる 読者になる

おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

Railsのfilterが途中で終了する条件についてメモ

rails

下記のくまくまーさんのエントリを見て、へーなるほどと思ったんだけど。

コントローラを継承している場合、親クラスのコントローラで定義された Filter が先に実行されます。また、Filter を評価した値(戻り値)が false である場合、その時点で Filter の適用は停止され、以降の Filter は実行されません。(これは継承とは無関係に Filter の特徴です)

ヽ( ・∀・)ノくまくまー(2005-07-20)

実際に下記のコードで試してみたら、filter2は実行されてしまいました。(Main#indexにアクセスしたらfugaが表示された)

class ApplicationController < ActionController::Base
  helper :all
  protect_from_forgery
  before_filter :filter1

  def filter1
    false
  end
end

class MainController < ApplicationController
  before_filter :filter2
  
  def index
    # viewで@textを表示
  end
  
  private
  def filter2
    @text = "fuga"
  end
end

くまくまーさんのエントリは3年前のものなので、どこかでRailsの仕様が変わったんでしょうね。

おまけ

リファンレンスをみたら、「filterの中でrenderかredirect_toしてたら次のfilterは実行されないよ」と行ったことが書いてあったので試してみたら、リファレンス通りfilter2は実行されませんでした(Main#indexにアクセスしてもfugaは表示されなかった)。

class ApplicationController < ActionController::Base
  helper :all
  protect_from_forgery
  before_filter :filter1

  def filter1
    render :template => "main/index" # 変更点 
  end
end
class MainController < ApplicationController
  before_filter :filter2
  
  def index
  end
  
  private
  def filter2
    @text = "fuga"
  end
end