$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

before_actionなどのCallbacksに登録されているものを知る方法

と悩んでいたが、方法を教えてもらえたり、便利なツールを発見したりしたのでメモ。方法は二つ。

  • 特定アクションアクセス時に登録されているCallbacksを全て表示する
  • Callbacksが呼ばれたときにログを出力

特定アクションアクセス時に登録されているCallbacksを全て表示する

Debugging Action Callbacks (aka Filters) in Rails | Hashrocket

pry-railsを使い、_process_action_callbacksを見ることで、実行予定のCallbacksを全て表示するという方法がある。

pry-railsをインストールした後に、出力したいアクションの周囲に以下のコードを入れる。

  prepend_before_action do
    require 'pry'
    binding.pry
    true
  end

その後、そのアクションが実行されるURLにアクセスすると、pryが立ち上がるので、_process_action_callbacksを呼ぶと良い。すると以下のように出力され、このアクションではどのCallbacksが実行予定なのかを把握することが可能だ。

f:id:shiba_yu36:20211114164836p:plain

Callbacksが呼ばれたときにログを出力

先程の作戦は、特定アクションに紐づく一覧を全て出力する形式だった。一方で実際に呼ばれたものだけ表示したいという場合もある。このような時は、以下のようなツールを使い、呼ばれた場合にログを出力することもできる。

github.com

これを使い、tail -F log/action_tracer.log することで、何が登録されていて、何が適用されているかが一目瞭然となる。便利。

I, [2021-11-15T11:19:21.482139 #71440]  INFO -- : ["NO_APPLIED", :Proc, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/devise-4.8.0/app/controllers/devise/sessions_controller.rb", 7]
I, [2021-11-15T11:19:21.482214 #71440]  INFO -- : ["NO_APPLIED", :verify_signed_out_user, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/devise-4.8.0/app/controllers/devise/sessions_controller.rb", 61]
I, [2021-11-15T11:19:21.482243 #71440]  INFO -- : ["NO_APPLIED", :allow_params_authentication!, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/devise-4.8.0/lib/devise/controllers/helpers.rb", 163]
I, [2021-11-15T11:19:21.482270 #71440]  INFO -- : ["APPLIED", :require_no_authentication, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/devise-4.8.0/app/controllers/devise_controller.rb", 102]
I, [2021-11-15T11:19:21.482315 #71440]  INFO -- : ["APPLIED", :assert_is_devise_resource!, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/devise-4.8.0/app/controllers/devise_controller.rb", 64]
I, [2021-11-15T11:19:21.482345 #71440]  INFO -- : ["APPLIED", :verify_authenticity_token, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/actionpack-6.1.4.1/lib/action_controller/metal/request_forgery_protection.rb", 227]
I, [2021-11-15T11:19:21.482377 #71440]  INFO -- : ["APPLIED", :set_turbolinks_location_header_from_session, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/turbolinks-5.2.1/lib/turbolinks/redirection.rb", 43]
I, [2021-11-15T11:19:21.482457 #71440]  INFO -- : ["APPLIED", :Proc, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/actiontext-6.1.4.1/lib/action_text/engine.rb", 58]
I, [2021-11-15T11:19:21.482487 #71440]  INFO -- : ["ACTION", "new", "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/devise-4.8.0/app/controllers/devise/sessions_controller.rb", 10]
I, [2021-11-15T11:19:21.482516 #71440]  INFO -- : ["APPLIED", :Proc, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/actiontext-6.1.4.1/lib/action_text/engine.rb", 58]
I, [2021-11-15T11:19:21.482533 #71440]  INFO -- : ["APPLIED", :verify_same_origin_request, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/actionpack-6.1.4.1/lib/action_controller/metal/request_forgery_protection.rb", 257]
I, [2021-11-15T11:19:21.482552 #71440]  INFO -- :