🤗

Ruby on Railsの開発時に知っておくと幸せになるbinding.pryのデバッグTips|Offers Tech Blog

2022/06/02に公開

こんにちは!
プロダクト開発人材の副業転職プラットフォーム Offers を運営する株式会社 overflow のエンジニアの Taiga です。

今回は、Ruby on Rails で開発するエンジニアならよくお世話になっているであろうpry(binding.pry)についてよく使うメソッドをまとめてみたいと思います!

個人的に、Ruby on Rails で開発する時にはなくてはならないメソッド達になっています。
少しでも役に立てれば幸いでございます!

binding.pryとは何か

ソースコード上に binding.pry と記載してからプログラムを実行すると、
その当該場所で止まり、前後の変数やクラスなどの情報を取得、変更できるライブラリです。

なぜpryを使うのが良いのか

Ruby の console は 2 種類存在していて、標準では irb(Interactive Ruby) を搭載しています。
Ruby 2.7 以降では irb も REPL improvement として機能改善されていますが、以下の点で pry のほうが使用感に優れています。

  • シンタックスハイライトが標準で使用可能
  • 便利なコマンドが標準で使用可能

使うタイミング

実際に使うタイミングですが、

  • コードの流れを調べたい時、
  • rails console でデータを検証する時、
  • テストコードからメソッドを読んで検証したい時
  • エラー発生した時

などなど、とにかく毎日使っております。
binding.pry は大抵の場所(View や Model、Controller やその他諸々)に仕込めるので、コードの流れを掴むのにかなり重宝しています。

導入方法等は、ドキュメントに書いてあるので割愛させていただきます(Gem追加してbundle installするだけです)

https://github.com/pry/pry-rails

reload! で上書き更新する

rails console 上でデバッグしている際に、「あっ、ここのコード変えたい」っていう時に使えます。

わざわざ console を exit せずともに、ファイルを変更した後に、reload! すれば、再読み込みされてまた実行できます。

exit すると変数を再度定義し直す必要があるので、極力 exit せずに reload!を使っていきたいところですね。

@ と $ で現在位置確認

記述量や行数が多いファイルでデバッグをしていて、「自分がどこに binding.pry を埋め込んだのかわからなくなった😭」って時に使えます。

console 上で @ を打てば、binding.pry を仕込んだ場所が出力されます。ちなみに、whereami の alias です。$ を打つと、そのファイル全体が出力されます。

cd と ls と self で移動して調べる

デバッグ時に、「このクラス(インスタンス)にはどんなメソッドが生えているんだっけ?🤔」といった時に使えます。
例えば、インスタンスからcdしてクラスに移動して、どんなメソッドが使えるかなど見られるので地味に便利です。

特に Gem やライブラリ特有のメソッドを探す時や、長い命名のものを調べる時に重宝します。

例えば、長い命名モデルがあったとします (console 上で find した程)

 pry(main)> @task_hoge_huge_piyo_piko => #<TaskHogeHugaPiyoPiko:0x00007fe70720eb58
 id: 1,
 title: "test",
 status: "todo",
 deadline: nil,
 completion_date: nil,
 description: nil,
 created_at: Mon, 23 May 2022 19:52:49 JST +09:00,
 updated_at: Mon, 23 May 2022 19:52:49 JST +09:00>

今の現在地は main です。

pry(main)> self
=> main

それを、cd で調査したい対象へ

pry(main)> cd @task_hoge_huge_piyo_piko
pry(<TaskHogeHugaPiyoPiko>):1>) self # main から @task_hoge_huge_piyo_piko へ cd
pry(<TaskHogeHugaPiyoPiko>):1> self # pwd がインスタンスに!
# 結果は @task_hoge_huge_piyo_pikoのインスタンス

このように、cd で調査対象を移動、ls で調査のような流れで、メソッドを深く探索できます。

pry(<TaskHogeHugaPiyoPiko>):1> ls self
# 結果は、@task_hoge_huge_piyo_pikoで使えるメソッドが全て見れる。
# また cd をもう一度入力すれば 一つ前に戻ります (今回はmainへ)

この例だと console 上でのたとえなのであまりありがたみを感じづらいですが、実際にデバッグ時に調査対象を変えて深く探索して調べられるので、おすすめです。

その他備考

binding.pry の出入力ですが、exit や next などのコマンドがあります。毎回全部入力するのは億劫なので、alias を作っておくと捗ります。

下記をコピーして、pbpaste > .pryrc して頂くと、

if defined?(PryByebug)
  Pry.commands.alias_command "s", "step"
  Pry.commands.alias_command "n", "next"
  Pry.commands.alias_command "f", "finish"
  Pry.commands.alias_command "c", "continue"
  Pry.commands.alias_command "e", "exit"
end

まとめ

実は今まで紹介したコマンドは console 上で
help を叩けば全部出てくるので、チートシートとして使ってみてください!

関連記事

https://zenn.dev/offers/articles/20220421-rspec-merit-and-demerit-and-tips

Offers Tech Blog

Discussion