LoginSignup
2
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-08

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
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2