9
11

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 3 years have passed since last update.

【Rails】Pryを使ったメソッドのデバッグ方法

Last updated at Posted at 2020-01-20

Rails案件で「pry」を使って実装したメソッドをデバッグする機会があったので、使い方の備忘録

pryとは

REPLで対話的にプログラムを実行したり、ActiveRecordを利用したDB操作や、変数の中身を調べることができるコマンドラインツール
※ Laravelで言うところの「tinker」とほぼ同じような使い方ができる、超便利なデバッグツール

サンプル

サンプルとして、以下のメソッドを例に解説

app/lib/utils/test_sample.rb
module Utils
  module TestSample
    class << self
      def sample_method(param)
        data = [1, 2, 3, 4, 5]

        data.each do |r|
          if r == param
            return true
          end
        end

        return false
      end
    end
  end
end

メソッドのデバッグ方法

bundle exec rails cで、コンソールを立ち上げる

$ bundle exec rails c
Loading development environment (Rails 6.0.0)
[1] pry(main)> 

ソースコードの「ブレークポイントを貼りたい箇所」にbinding.pryを差し込む

app/lib/utils/test_sample.rb
module Utils
  module TestSample
    class << self
      def sample_method(param)
        data = [1, 2, 3, 4, 5]        

        data.each do |r|
+         binding.pry
          if r == param
            return true
          end
        end

        return false
      end
    end
  end
end

※ 変更を加えた際の反映は、pryのコンソールにreload!を入力してリロードすること

コンソールから、デバッグしたいメソッド指定して実行する

[1] pry(main)> reload!
Reloading...
=> true
[2] pry(main)> Utils::TestSample.sample_method 3

From: /Users/nakano_shingo/Documents/minnshu-gms/app/lib/utils/test_sample.rb @ line 8 Utils::TestSample.sample_method:

     4: def sample_method(param)
     5:   data = [1, 2, 3, 4, 5]
     6: 
     7:   data.each do |r|
 =>  8:     binding.pry
     9:     if r == param
    10:       return true
    11:     end
    12:   end
    13: 
    14:   return false
    15: end

※ 引数を指定したい場合は、上記のようにスペースの後に引数を渡す

その時点の変数の値を確認したい場合は、コンソールに変数名を入力する

[1] pry(Utils::TestSample)> param
=> 3
[2] pry(Utils::TestSample)> r
=> 1

pryのコマンドは、以下のようにコンソールからhelpを入力すると使い方を教えてくれる

pry> help <コマンド>

よく使うコマンド

コマンド 説明
next 次の行を実行
step 次の行かメソッド内に入る
continue プログラムの実行をcontinueしてpryを終了
finish 現在のフレームが終わるまで実行
exit/quit 実行中のステップを終了し、次のステップ(binding.pry)まで処理を実行
!!! pryのコンソールを抜ける
※ 参考: Pryコマンドまとめ - Qiita

「next」や「step」などのコマンド実行時、以下のエラーが出る場合

SyntaxError: (eval):2: Can't escape from eval with next

こちらを参考にpry-navのgemを追加で導入すればOK


スクリプト言語でも、デバッグ時に手軽にステップ実行ができるのはとても便利ですね

9
11
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
9
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?