レスポンス生成直前に動作をかます before_render

rails のアクションに対するコールバックは、filter 機能を使うことで実現できます。
filter には、アクションの実行直前に動作をかます「before_filter」、アクションを実行し、レスポンスが生成された後に動作をかます「after_filter」があります。
これだと、アクション実行後とレスポンス生成の間に動作を挟むということはできません。でも今回必要だったので書きました。

before_render

  • action_controller_ext.rb
module ActionController
  module Callbacks
    def self.included(klass)
      klass.extend(ClassMethods)
    end
    
    module ClassMethods
      def before_render(method, options = {})        
        self.class_eval <<-EOS
          protected

          def extend_render_with_callback
            def render(*args)
              #{method}
              super
            end

            self.class.send(:protected, :render)
          end
        EOS
        
        self.before_filter(:extend_render_with_callback, options)
      end
    end
  end
end

ActionController::Base.send(:include, ActionController::Callbacks)

使い方

  • 準備
    • 「action_controller_ext.rb」をロードパスの通ったディレクトリに追加。例えば、「lib」ディレクトリに置けばおk
    • 「config\environment.rb」の最後に以下を追加
require 'action_controller_ext'
  • 書き方
class UserController < ApplicationController
  before_render :hoge

  private
  
  def hoge
    #レスポンス生成直前に実行したい動作を書く
  end
end