はじめに
既存実装の調査にあたり、特定のメソッドがどう利用されているのかを実際に処理を動かしながら確認したかった
問題
対象のメソッドが複数箇所から複数回、多階層に渡ってなど想像以上に複雑な呼ばれ方をしており、単純にログから追う形では把握が難しかった
なんだか毎回調べている気がするため備忘として
解決方法
callerメソッドを利用することでバックトレースを確認することが出来る。
app/controllers/test_controller.rb
class TestController < ApplicationController
def index
test_method
@tests = Test.all
end
private
def test_method
p '呼ばれたよ'
# callerメソッドを利用してバックトレースを出力
puts caller
end
end
ターミナル出力
"呼ばれたよ"
/app/controllers/tests_controller.rb:3:in `index'
/usr/local/bundle/ruby/3.2.0/gems/actionpack-7.0.7.2/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
/usr/local/bundle/ruby/3.2.0/gems/actionpack-7.0.7.2/lib/abstract_controller/base.rb:215:in `process_action'
/usr/local/bundle/ruby/3.2.0/gems/actionpack-7.0.7.2/lib/action_controller/metal/rendering.rb:165:in `process_action'
/usr/local/bundle/ruby/3.2.0/gems/actionpack-7.0.7.2/lib/abstract_controller/callbacks.rb:234:in `block in process_action'
︙
おわりに
callerメソッドを利用する事でバックトレースを参照する事が出来る。
また、callerメソッドの返り値は文字列の配列であるため、putsメソッドを利用する事で改行を含めて見やすい形で表示する事が出来る。
さらに必要に応じてcaller.first や caller[0..2]といった記法を利用することで、必要に応じて表示範囲を制限することもできます
参考にさせて頂いた記事など