Rails binding.pry入門:セットアップと基本コマンドの使い方
はじめに
Railsの開発中にコードが期待通り動かないとき、puts で変数を出力しながらデバッグするのは効率が悪いです。binding.pry を使えば、コードが実行されているその場所で一時停止して、変数の中身を確認したりコードを試したりできます。
この記事ではセットアップから基本コマンドまでを解説します。実践的な使い方は「Rails binding.pry実践:コントローラー・モデル・テストでのデバッグ」を参照してください。
セットアップ
Gemfile に以下を追加します。
group :development, :test do gem 'pry-rails' gem 'pry-byebug' end
インストールします。
bundle install
- pry-rails:Railsコンソールをpryに置き換える
- pry-byebug:
next・step・continueなどステップ実行のコマンドを追加する
基本的な使い方
デバッグしたい箇所に binding.pry を書きます。
def show @user = User.find(params[:id]) binding.pry # ここで一時停止する render :show end
サーバーを起動してその処理を実行すると、ターミナルで一時停止します。
From: app/controllers/users_controller.rb:4 UsersController#show:
2: def show
3: @user = User.find(params[:id])
=> 4: binding.pry
5: render :show
6: end
[1] pry(#<UsersController>)>
=> が現在の位置です。この状態でコマンドを入力できます。
基本コマンド
変数の確認
プロンプトに変数名を入力するとその値が表示されます。
[1] pry(#<UsersController>)> @user => #<User id: 1, name: "田中太郎", email: "tanaka@example.com"> [2] pry(#<UsersController>)> params => {"action"=>"show", "controller"=>"users", "id"=>"1"}
Rubyのコードをその場で実行することもできます。
[3] pry(#<UsersController>)> @user.name.upcase => "田中太郎".upcase
実行を進める
| コマンド | 省略形 | 動作 |
|---|---|---|
next |
n |
次の行へ進む(メソッド内には入らない) |
step |
s |
次の行へ進む(メソッドの中に入る) |
continue |
c |
次の binding.pry まで実行を再開する |
finish |
f |
現在のメソッドを抜けるまで実行する |
exit |
pryを終了して処理を続ける |
現在位置を確認する
[4] pry(#<UsersController>)> whereami
From: app/controllers/users_controller.rb:4 UsersController#show:
2: def show
3: @user = User.find(params[:id])
=> 4: binding.pry
5: render :show
6: end
現在どこで止まっているかを再表示します。
メソッドや変数の一覧を確認する
[5] pry(#<UsersController>)> ls @user
@user が持つメソッドとインスタンス変数の一覧が表示されます。
ソースコードを確認する
[6] pry(#<UsersController>)> show-source @user.class
指定したクラスやメソッドのソースコードを表示します。
コンテキストを切り替える
[7] pry(#<UsersController>)> cd @user [8] pry(#<User>)> name => "田中太郎"
cd でオブジェクトの中に入ると、そのオブジェクトのコンテキストでコマンドを実行できます。cd .. で元に戻ります。
よくあるミス
サーバーやテストが止まったまま
binding.pry を書いたまま処理が実行されると、ターミナルが待ち状態になります。continue または exit で抜けてください。
本番環境にbinding.pryを残してしまう
pry-rails と pry-byebug は development・test グループにのみ入れているので、本番環境ではgemがなく binding.pry を書いていてもエラーになります。ただしコードに残すのは良くないので、デバッグ後は必ず削除してください。
next で意図しない場所に進む
next はメソッドの中には入らずに次の行へ進みます。メソッド内部を追いたい場合は step を使います。
まとめ
| コマンド | 用途 |
|---|---|
next / n |
次の行へ(メソッドに入らない) |
step / s |
次の行へ(メソッドの中に入る) |
continue / c |
次のbinding.pryまで再開 |
exit |
pryを終了 |
whereami |
現在位置を表示 |
ls |
メソッド・変数一覧 |
cd |
コンテキスト切り替え |
show-source |
ソースコードを表示 |
基本コマンドに慣れたら「Rails binding.pry実践:コントローラー・モデル・テストでのデバッグ」で具体的な使い方を確認してみてください。