更新日:
【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のコンソールでメソッドなどを使えることができるようになる機能のこと
- デバッグやソースコードなどを簡単に確認すること出来る