【Rails】Pryについて徹底解説!
Pryとは
Rubyのirbのようにrailsのコンソールでメソッドなどを使えることができるようになる機能です。
irbでもメソッドなどが使えるのですが、Pry(プライ)だとより高度なことをすることができます。
railsではデバック(バグなどを発見すること)をする際、Pryを使う時が多いです。
今回の記事でPryを使ったデバックのやり方をマスターしておきましょう。
Pryをインストールしよう
初期状態だと「rails c」コマンドでコンソールモードにした際、irbが起動します。
Pryを起動させるにはPryを使えるようgemを追加する必要があります。
Gemfileに下記のgemを追加しましょう。
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に追加しておくと良いでしょう。
追加するには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は簡単にデバッグやソースコードが確認できる非常に便利な機能です。