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

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

after_filterの実行タイミングではまった

after_filterは、各アクションのrenderの後に実行されるようです。下記でhogeアクションを実行するとActionController::DoubleRenderErrorになります。

class HogeController < ApplicationController
  after_filter :render_test
  
  def hoge
  end
  
end
class ApplicationController < ActionController::Base
  def render_test
    render :template => 'test'
    return
  end
end

もちろん、after_filterなど使わずhogeアクション内にrenderメソッドを記述してあげればエラーは出なくなるのですが・・・複数のアクションを使うときはめんどくさい><

railsのフィルタの使い方いろいろ

上記のafter_filterでハマっている最中に新しく覚えたことをメモ。
フィルタの定義は下記のように書くのがよくあるパターンだと思います。

  before_filter :hoge

ブロックを使う書き方もあるようです。この場合、パラメータにはコントローラが入ります。

  before_filter do |controller|
    #...
  end

メソッドの代わりにクラスを指定することもできるみたいです。

  before_filter HogeController

この場合、コントローラをパラメータとして、指定されたクラスのfilterメソッドが呼び出されるようです。なので下記のようにfilterメソッドを定義してあげるとよいみたい。

class HogeController < ApplicationController
  def self.filter(controller)
    #...
  end
end

複数のコントローラでフィルタを共有するときに使えるのかな。

追記(2008/6/27)

結局renderメソッドを再定義することで解決しました。時間があったら詳しくまとめます。