更新日:
【Rails】 Pryを使ってデバッグをしてみよう!
Pryとは、RubyのirbのようにRailsのコンソールでメソッドなどを使えることができるようになる機能です。

irbでもメソッドなどが使えるのですが、Pry(プライ)だとより高度なことをすることができます。
Railsで開発をするときは、デバック(バグなどを発見すること)でPryを使うことが多いです。
この記事を読んで、Pryを使ったデバック方法をマスターしておきましょう。
Pryの使い方
この章では、Pryの導入方法から使い方まで1つ1つ丁寧に解説します。
gemをインストール
初期状態だとrails cコマンドでコンソールモードにした際、irbが起動します。
Pryを起動させるにはPryを使えるようpry-railsというgemを追加する必要があります。
Gemfileに以下を記述します。
1
gem 'pry-rails'
その後、bundle install でgemをインストールします。
これでコンソールモードにした時Pryモードになるようになります。
pry-rails
rails cコマンドでコンソールを立ち上げたとき、irbでなくPryを起動させることができるgemです。
また、便利なコマンドを実行できるようになります。
(※コマンドについてはこのあと解説します)
Pryを使ってデバッグしてみよう
それではPryはどういったときに使うのでしょうか?
例えば投稿フォームに入力した情報がデータベースに保存されないというエラーが発生したとします。
そういった場合、原因がどのコードにあるのかをPryを使って確認することができます。
ここで登場するのがbinding.pryです。
binding.pry
binding.pryという文字列をコード内に記述すると、そこがブレイクポイントとなりrailsの処理を止めることができます。
ブレイクポイント
ブレイクポイントとはアプリケーションの実行がプログラムの特定の場所に達した時、プログラムの実行が停止する位置を指します。
そしてその場所でirbやPryが起動します。

上のように記述するとcreateアクションが呼び出された際、User.create(user_params)のコードが実行されたあと、プログラムの実行が停止されPryが起動します。

10行目で止まっているという目印で=>がついているのが確認できます。
そして[1] pry(#<UsersController>)>とコマンドが入力できる状態になっています。
ここで色々なコマンドを入力できるので、変数の中身やparamsで取り出せるパラメーターなどの確認ができるわけです。
またコードに色がついてみやすくなっているのがわかりますね。
ここもirbモードと違う点になります。
今回は投稿フォームに入力した内容が保存されないという問題を解決したいので、実際にparamsで取り出せるパラメーターの中に入力した情報があるかを確かめたいですね。
そういうときにはparamsと入力するとparamsメソッドが実行され、返り値がターミナルに出力されます。

するとこのようにparamsの結果を確認することができました。
よくみるとnameのバリューが""と何も入っていないことがわかります。

paramsで取得できなかったため、データベースに保存されなかったというわけですね。
ということは今回は投稿フォームの記述に問題があったということでどのファイルを修正すれば良いのかという原因を突き止めることができました。
Pryモードを終了させるにはexitと入力します。
確認した後はbinding.pryの記述を消しておくのを忘れないようにしましょう。
このようにどの部分が間違っているのかということを突き止める時などにbinding.pryを使用します。
ビューでbinding.pryを使ってみよう
binding.pryはコントローラーだけでなく、ビューファイルでも使うことができます。

このようなときにはbinding.pryでプログラムを止めて、Pryモードになったらuserの中身を確認することができます。

このようにプログラムが止まりました。
userの中身を見たいので、userと入力します。

するとこのようにuserの中身を確認することができました。
他にもモデルでも使うことができます。
Pryで使えるコマンドを確認しよう
Pryモードではirbでは使うことができない便利なコマンドを使うことができます。
下に紹介する他にもたくさんあります。
helpと入力すると全てのコマンドが確認できるので、気になる方は調べてみましょう。
※詳細は ⇨ 公式サイトへ
| コマンド | 内容 |
|---|---|
| show-routes | 現在のルーティングを確認 |
| show-models | 現在のモデルを確認 |
| show-source | クラスやモジュール、メソッドの定義を確認 |
| show-doc | クラスやモジュール、メソッドのドキュメントを確認 |
show-routes
現在のルーティングを確認することができるコマンドです。
このコマンドはrailsのコンソールモード内でのみ使用できます。
pryコマンドでpryモードにした時には使えないので注意しましょう。

オプションで--grep モデル名とすると指定したモデルのルーティングのみ表示することができます。

オプションで--grep アクション名とすると指定したアクションのルーティングのみ表示することができます。

show-models
現在のモデル全てを確認することができるコマンドです。
このコマンドもrailsのコンソールモード内でのみ使用できます。
pryコマンドでpryモードにした時には使えないので注意しましょう。

このようにアソシエーションまで確認することができます。
またshow-model モデルクラス名とするとモデルを指定して表示することも可能です。
このときmodelと単数形になるので注意しましょう。

show-source
show-source メソッド名とするとメソッドの定義を確認することができます。
ただしC言語で書かれたメソッドはpry-docというgemを入れていないと表示することができません。
pry-railsと一緒に入れておくと良いでしょう。
その際Gemfileには下記のように記述します。
1
gem 'pry-doc'
実行すると下の画像のようにメソッドのソースを確認することができます。

putsメソッドは上の画像のFrom: io.c (C Method)とあるようにC言語で書かれたメソッドです。
pry-docをインストールしておくとこのように確認することができます。
このgemを入れていないと下記のようにエラーが出て確認することができません。

またこのコマンドはaliasでshow-methodと$が用意されています。
alias
alias(エイリアス)とはコマンドを別名で登録したものです。
ショートカットのようなものとイメージするとわかりやすいです。

このようにaliasを使って短いコマンドで実行することもできます。
クラスで定義されているメソッドを確認するにはshow-source クラス名#メソッド名と記述します。

Pryモードではcdコマンドでクラスの中に入ることもできます。
クラスの中でlsコマンドを入力するとそのクラスで定義されているメソッドを確認することができます。
クラス内に入った状態でshow-source メソッド名とするとshow-source クラス名#メソッド名と入力した時と同じようにメソッドの定義を確認することができます。

クラスの中から出るには上の画像の最後のようにexitと入力するとmainに戻ることができます。
pry-byebugを使ってみよう
pray-railsの他にもpry-byebugというgemもあります。
pry-railsよりも機能が豊富なのでこれもGemfileに追加しておくと良いでしょう。
pry-byebugの便利なコマンド
pry-byebugの追加は、以下のようにGemfileに記述しbundle installします。
1
gem 'pry-byebug'
インストールすると、以下のコマンドが使えるようになります。
| コマンド | 機能 |
|---|---|
| break | ブレイクポイントを作ることができる |
| next | 次の行を実行する |
| step | 次の行またはメソッドを実行する引数に数値を指定すると その回数stepする |
| finish | 現在のフレームが終わるまで実行する |
| continue | プログラムの実行を続け、Pryモードを終了する |
どれも非常に便利なコマンドなので、詳しく見ていきましょう。
break
ブレイクポイントを作成するコマンドです。
通常ブレイクポイントはbinding.pryを記述した場所になりますが、このコマンドによりターミナル上からブレイクポイントを作成することができます。
ただし、どこかにbinding.pryを記述している必要があります。
1
2
3
# 例
break n # 現在のファイルのn行目をブレイクポイントに指定
break ファイル名:n "#指定したファイルのn行目をブレイクポイントに指定

next
nextは単純に次の行が実行されます。

次の行でメソッドが呼び出されていてもメソッド実行の場所には移動せず、次の行が実行されます。
step
stepを使うと次の行かメソッドを実行します。
下記の位置にbinding.pryを記述して実際にstepを使ってみます。

nextと違い、実行時にメソッドがあるとそのメソッドの中に移動します。

ブレイクポイントではuser_paramsというメソッドが使われているので、そのメソッドを実行しに行き、その中でparamsというメソッドが実行されているので、paramsメソッドの部分が表示されたというわけです。
プログラムがどういう流れで動いているのか確認するときに便利ですね!
finish
finishはメソッド内に入ったとき、そのメソッドから抜けてメソッドの呼び出し元の次の行へブレイクポイントを移動します。

continue
continueを実行するとプログラムの実行を続け、Pryモードを終了させることができます。

検証が終わったらexitか、このコマンドを打ちましょう。
※詳細は公式サイトへ
コマンドのaliasを作成しよう
このようにpry-byebugにはデバッグに便利なコマンドが用意されています。
頻繁に使うのであればもっと短いコマンドで実行したいですよね。
そんな時はaliasを作成しておきましょう。
では実際にaliasを作成してみます。
作成するにはアプリケーションフォルダの直下(Gemfileなどと同じ階層)に.pryrcというファイルを作成し、そのファイルにコードを記述します。
1
2
3
4
5
6
if defined?(PryByebug)
Pry.commands.alias_command 'c', 'continue'
Pry.commands.alias_command 's', 'step'
Pry.commands.alias_command 'n', 'next'
Pry.commands.alias_command 'f', 'finish'
end
上のように記述するとcと入力すればcontinueが実行されます。

頻繁に使うという時はぜひaliasを作成しておきましょう。
また下記のコードを追加するとenterを押すと直前に実行したコマンドを繰り返すことができます。
1
2
3
Pry::Commands.command /^$/, "repeat last command" do
_pry_.run_command Pry.history.to_a.last
end
Pryを使うとこのように簡単にデバッグができたり、ソースコードの確認をすることができます。
開発効率が大幅に上がるので、ぜひ導入をしてみましょう!
他にもコードの品質を上げる方法などより現場レベルに近い知識を身につけたい方は、この参考書がおすすめです。
この記事のまとめ
- Pryとは、Rubyのirbのようにrailsのコンソールでメソッドなどを使えることができるようになる機能のこと
- デバッグやソースコードなどを簡単に確認すること出来る