Rails
rack

RackのenvからRailsのControllerを取得する

More than 1 year has passed since last update.

Railsは4.1.1で検証しました。

例えばRackミドルウェアの中でロギングしていて、そこにRailsの情報も含めたいという場合、callの引数であるenvからRailsのControllerのインスタンスを取得することができます。

Controllerのインスタンスはenv['action_controller.instance']に格納されています。

これはairbrakeのユーザ連携などでも使用されています。

https://github.com/airbrake/airbrake/blob/baf02e0b3b112c34f31880d998344141729bc2ce/lib/airbrake/rack/user.rb#L25

Rackミドルウェアの場合、

def call(env)

status, headers, body = @app.call(env)
ensure
controller = env['action_controller.instance']
controller.class # => XXXController
end

とすることでインスタンスが取れるので、Railsがもつ様々な情報にアクセスできます。

# アクション名

env['action_controller.instance'].action_name => "show"
# ログに表示されるActiveRecordの実行時間(msec)
env['action_controller.instance'].db_runtime # => 30.77199999999999
# ログに表示されるViewの実行時間(msec)
env['action_controller.instance'].view_runtime # => 2.412
# params
env['action_controller.instance'].params
# request
env['action_controller.instance'].request
# 自前で定義したメソッドも呼べる
env['action_controller.instance'].current_user