Railsのbefore_actionとかが何が実行されたか知る方法はあるのだろうか
— 柴崎優季 (@shiba_yu36) 2021年11月12日
と悩んでいたが、方法を教えてもらえたり、便利なツールを発見したりしたのでメモ。方法は二つ。
- 特定アクションアクセス時に登録されているCallbacksを全て表示する
- Callbacksが呼ばれたときにログを出力
特定アクションアクセス時に登録されているCallbacksを全て表示する
Debugging Action Callbacks (aka Filters) in Rails | Hashrocketbefore_actionとかのフィルターの途中にpryとかでブレークポイントを置いて、_process_action_callbacksするとchainされてるもの一覧をみることができます。
— だーい (@daaaaaai) 2021年11月12日
フィルタ(コールバックとも)は便利だけれど、追いかけにくくて謎バグを生みやすくてつらいですよね・・
参考記事)https://t.co/a9Obwe35gr
pry-railsを使い、_process_action_callbacksを見ることで、実行予定のCallbacksを全て表示するという方法がある。
pry-railsをインストールした後に、出力したいアクションの周囲に以下のコードを入れる。
prepend_before_action do require 'pry' binding.pry true end
その後、そのアクションが実行されるURLにアクセスすると、pryが立ち上がるので、_process_action_callbacksを呼ぶと良い。すると以下のように出力され、このアクションではどのCallbacksが実行予定なのかを把握することが可能だ。
Callbacksが呼ばれたときにログを出力
先程の作戦は、特定アクションに紐づく一覧を全て出力する形式だった。一方で実際に呼ばれたものだけ表示したいという場合もある。このような時は、以下のようなツールを使い、呼ばれた場合にログを出力することもできる。
これを使い、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 -- :