あるフィルタが定義されているかどうかを知りたいとき、
Controller.find_filter は非常に便利で
1.x 時代から一部で重宝されていたが、
このたび Rails2.1 ではなくなってしまった。
これは obsoleted というより内部のクラス構成が変わってしまったことに起因する。
1 >> ApplicationController.filter_chain.class
2 => Array
1 >> ApplicationController.filter_chain.class
2 => ActionController::Filters::FilterChain
Controller.filter_chain は定義されたフィルタが格納されたオブジェクトであるが、これが 2.1 からは専用のFilterChainクラスに進化した。
これにより、以下のような数々のフィルタ操作メソッド
- find_filter
- append_filter_to_chain
- prepend_filter_to_chain
- ...
を直接コントローラに定義する(2.1以前)のではなく、
同クラスに持たせることができるようになった。
これは、名前空間的にも責務の明瞭化としても進化と言える。
従って、今後は Controller クラスに直接問い合わせるのでなく、
フィルタを管理する FilterChain インスタンスに尋ねることになる。
1 >> ApplicationController.filter_chain.find(:login_required)
2 =>
しかしながら、未だに1.2ユーザも多いプラグインなどでは後方互換性が必要である。
色んな対応策が考えられるが、
ここでは、2.1 側に涙を飲んでもらって、
せっかく奇麗にした所を悪いが find_filter を追加させてもらう。
1 ActionController::Base.class_eval do
2 unless respond_to?(:find_filter)
3 def self.find_filter(name)
4 filter_chain.find(name)
5 end
6 end
(vendor/plugins/xxx/init.rb)