下記のくまくまーさんのエントリを見て、へーなるほどと思ったんだけど。
コントローラを継承している場合、親クラスのコントローラで定義された 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