【Rails】Pryについて徹底解説!

Rails

Pryとは

Rubyのirbのようにrailsのコンソールでメソッドなどを使えることができるようになる機能です。

irbでもメソッドなどが使えるのですが、Pry(プライ)だとより高度なことをすることができます。

railsではデバック(バグなどを発見すること)をする際、Pryを使う時が多いです。
今回の記事でPryを使ったデバックのやり方をマスターしておきましょう。

Pryをインストールしよう

初期状態だと「rails c」コマンドでコンソールモードにした際、irbが起動します。
Pryを起動させるにはPryを使えるようgemを追加する必要があります。
Gemfileに下記のgemを追加しましょう。

ruby
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

するとこのように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には下記のように記述します。

ruby
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に追加しておくと良いでしょう。
追加するにはGemfileに下記のコードを記述し、bundle installします。

ruby
1
gem 'pry-byebug'

インストールすると下記のコマンドが使えるようになります。
※詳細は ⇨ 公式サイトへ

コマンド 機能
break ブレイクポイントを作ることができる
next 次の行を実行する
step 次の行またはメソッドを実行する引数に数値を指定するとその回数stepする
finish 現在のフレームが終わるまで実行する
continue プログラムの実行を続け、Pryモードを終了する

どれも非常に便利なコマンドなので、詳しく見ていきましょう。

break

ブレイクポイントを作成するコマンドです。
通常ブレイクポイントはbinding.pryを記述した場所になりますが、このコマンドによりターミナル上からブレイクポイントを作成することができます。
ただし、どこかにbinding.pryを記述している必要があります。

shell
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」というファイルを作成し、そのファイルにコードを記述します。

ruby
1
2
3
4
5
6
if defined?(PryByebug)
  Pry.commands.alias&#095;command 'c', 'continue'
  Pry.commands.alias&#095;command 's', 'step'
  Pry.commands.alias&#095;command 'n', 'next'
  Pry.commands.alias&#095;command 'f', 'finish'
end

上のように記述すると「c」と入力すれば「continue」が実行されます。
alias

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

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

Pryを使うとこのように簡単にデバッグができたり、ソースコードの確認をすることができます。
開発効率が大幅に上がるので、ぜひ導入をしてみましょう!

まとめ

Pryは簡単にデバッグやソースコードが確認できる非常に便利な機能です。