Filterクラスでの redirect_to や flash
コントローラーでの beforeフィルターでちょっと条件をチェックして、場合によっては余所にリダイレクトしようと思った。Railsレシピブック029 によれば、Rails2.0以上ならフィルターメソッドの中で直接 redirect_to すれば良いと言う事だ。
また、幾つかのコントローラーで共有するチェックなので、フィルター自体クラスにして別ファイルにした。
class <何かの>Controller before <チェック>Filter <普通にコントローラー沢山> end
そしてフィルタークラスの中で redirect_to してみたがそんなメソッドは無いと言われる、エラー。
redirect_to 自体は ActionController::Base のメソッドだからと、フィルターに引数として渡されるコントローラーをレシーバに明記してみる。protectedメソッドだから呼べないとエラー。確かに http://api.rubyonrails.org/ でも Protected Instance methods のところに書いてある。おかしいよね。
仕方ないので send で呼び出す事にする、何とかなった。
これは flashメッセージについても同様だった。
class <チェック>Filter def before(controller) <いろいろチェック> controller.send(:flash)[:error] = '<チェック> Error' controller.send :redirect_to, :controller => :<何か>, :action => :index, <いろいろ> end end