すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Rails

【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に以下を記述します。

Gemfile | Pryを追加する-->
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の処理を止めることができます。

ブレイクポイント

ブレイクポイントとはアプリケーションの実行がプログラムの特定の場所に達した時、プログラムの実行が停止する位置を指します。
そしてその場所でirbPryが起動します。

ブレイクポイント

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

ターミナル

10行目で止まっているという目印で=>がついているのが確認できます。
そして[1] pry(#<UsersController>)>とコマンドが入力できる状態になっています。

ここで色々なコマンドを入力できるので、変数の中身やparamsで取り出せるパラメーターなどの確認ができるわけです。

またコードに色がついてみやすくなっているのがわかりますね。
ここもirbモードと違う点になります。

今回は投稿フォームに入力した内容が保存されないという問題を解決したいので、実際にparamsで取り出せるパラメーターの中に入力した情報があるかを確かめたいですね。

そういうときにはparamsと入力するとparamsメソッドが実行され、返り値がターミナルに出力されます。

params

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

バリューが空っぽ

paramsで取得できなかったため、データベースに保存されなかったというわけですね。
ということは今回は投稿フォームの記述に問題があったということでどのファイルを修正すれば良いのかという原因を突き止めることができました。

Pryモードを終了させるにはexitと入力します。

確認した後はbinding.pryの記述を消しておくのを忘れないようにしましょう。
このようにどの部分が間違っているのかということを突き止める時などにbinding.pryを使用します。

ビューでbinding.pryを使ってみよう

binding.pryはコントローラーだけでなく、ビューファイルでも使うことができます。

ビューファイルのbinding.pry

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

ビューファイルのbinding.pryのターミナル

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

userの中身

するとこのようにuserの中身を確認することができました。
他にもモデルでも使うことができます。

Pryで使えるコマンドを確認しよう

Pryモードではirbでは使うことができない便利なコマンドを使うことができます。
下に紹介する他にもたくさんあります。
helpと入力すると全てのコマンドが確認できるので、気になる方は調べてみましょう。
※詳細は ⇨ 公式サイトへ

コマンド 内容
show-routes 現在のルーティングを確認
show-models 現在のモデルを確認
show-source クラスやモジュール、メソッドの定義を確認
show-doc クラスやモジュール、メソッドのドキュメントを確認

show-routes

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

shoe-routes

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

grep user

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

grep_index

show-models

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

show_models

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

show_model

show-source

show-source メソッド名とするとメソッドの定義を確認することができます。
ただしC言語で書かれたメソッドはpry-docというgemを入れていないと表示することができません。

pry-railsと一緒に入れておくと良いでしょう。
その際Gemfileには下記のように記述します。

Gemfile -->
1
gem 'pry-doc'

実行すると下の画像のようにメソッドのソースを確認することができます。

show_source

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

エラーメッセージ

またこのコマンドはaliasでshow-method$が用意されています。

alias

alias(エイリアス)とはコマンドを別名で登録したものです。
ショートカットのようなものとイメージするとわかりやすいです。

$ puts

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

show-method

Pryモードではcdコマンドでクラスの中に入ることもできます。
クラスの中でlsコマンドを入力するとそのクラスで定義されているメソッドを確認することができます。

クラス内に入った状態でshow-source メソッド名とするとshow-source クラス名#メソッド名と入力した時と同じようにメソッドの定義を確認することができます。

cd クラス名

クラスの中から出るには上の画像の最後のようにexitと入力するとmainに戻ることができます。

pry-byebugを使ってみよう

pray-railsの他にもpry-byebugというgemもあります。
pry-railsよりも機能が豊富なのでこれもGemfileに追加しておくと良いでしょう。

pry-byebugの便利なコマンド

pry-byebugの追加は、以下のようにGemfileに記述しbundle installします。

Gemfile -->
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行目をブレイクポイントに指定

break 9

next

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

next

次の行でメソッドが呼び出されていてもメソッド実行の場所には移動せず、次の行が実行されます。

step

stepを使うと次の行かメソッドを実行します。
下記の位置にbinding.pryを記述して実際にstepを使ってみます。

binding.pry

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

step

ブレイクポイントではuser_paramsというメソッドが使われているので、そのメソッドを実行しに行き、その中でparamsというメソッドが実行されているので、paramsメソッドの部分が表示されたというわけです。

プログラムがどういう流れで動いているのか確認するときに便利ですね!

finish

finishはメソッド内に入ったとき、そのメソッドから抜けてメソッドの呼び出し元の次の行へブレイクポイントを移動します。

finish

continue

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

continue

検証が終わったらexitか、このコマンドを打ちましょう。

※詳細は公式サイトへ

コマンドのaliasを作成しよう

このようにpry-byebugにはデバッグに便利なコマンドが用意されています。
頻繁に使うのであればもっと短いコマンドで実行したいですよね。
そんな時はaliasを作成しておきましょう。

では実際にaliasを作成してみます。
作成するにはアプリケーションフォルダの直下(Gemfileなどと同じ階層)に.pryrcというファイルを作成し、そのファイルにコードを記述します。

.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

頻繁に使うという時はぜひaliasを作成しておきましょう。
また下記のコードを追加するとenterを押すと直前に実行したコマンドを繰り返すことができます。

.pryrc -->
1
2
3
Pry::Commands.command /^$/, "repeat last command" do
  _pry_.run_command Pry.history.to_a.last
end

Pryを使うとこのように簡単にデバッグができたり、ソースコードの確認をすることができます。

開発効率が大幅に上がるので、ぜひ導入をしてみましょう!

他にもコードの品質を上げる方法などより現場レベルに近い知識を身につけたい方は、この参考書がおすすめです。

この記事のまとめ

  • Pryとは、Rubyのirbのようにrailsのコンソールでメソッドなどを使えることができるようになる機能のこと
  • デバッグやソースコードなどを簡単に確認すること出来る