4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【学習備忘録】アウトプットの習慣化を目指したいAdvent Calendar 2023

Day 8

【Rails】メソッド呼び出し時のバックトレースを確認したい

Posted at

はじめに

既存実装の調査にあたり、特定のメソッドがどう利用されているのかを実際に処理を動かしながら確認したかった

問題

対象のメソッドが複数箇所から複数回、多階層に渡ってなど想像以上に複雑な呼ばれ方をしており、単純にログから追う形では把握が難しかった
なんだか毎回調べている気がするため備忘として

解決方法

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]といった記法を利用することで、必要に応じて表示範囲を制限することもできます

参考にさせて頂いた記事など

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?