Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby on Rails | 複数のコントローラーで利用する共有フィルタを作成する

概要

複数のコントローラーで利用する共有フィルタを作成する

内容

複数のコントローラーで利用する共有フィルタを作成します。
任意のフィルタ用クラスを実装し、
before,after,filterのどれかのメソッドを実装します。
それぞれ
before_action,after_action,around_actionに対応します。

サンプル

コントローラーの呼び出し前後にLTSV形式のロギング機能を追加します。

Filter用クラス
app/controller/concerns/controller_trace_log_filter

class ControllerTraceLogFilter
  def filter(c, &action)
    class_name = "#{c.params[:controller].capitalize}Controller"
    method_name = c.params[:action]
    login = c.current_user.login if c.current_user

    start_time = Time.now_msec
    trace_start = {se_flg: "start", user: login, class_name: class_name, method_name: method_name, total_time: "", params: c.params}
    c.logger.debug trace_start

    yield

    end_time = Time.now_msec
    trace_end = {se_flg: "end", user: login, class_name: class_name, method_name: method_name, total_time: "#{(end_time - start_time).to_s} msec", params: ""}
    c.logger.debug trace_end
  end
end

application_controller.rbから自作フィルタの呼び出しを指定

class ApplicationController < ActionController::Base
  # 略
  around_action ControllerTraceLogFilter.new
  # 略
end