Rails binding.pry入門:セットアップと基本コマンドの使い方

スポンサーリンク

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-byebugnextstepcontinue などステップ実行のコマンドを追加する

基本的な使い方

デバッグしたい箇所に 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-railspry-byebugdevelopmenttest グループにのみ入れているので、本番環境ではgemがなく binding.pry を書いていてもエラーになります。ただしコードに残すのは良くないので、デバッグ後は必ず削除してください。

next で意図しない場所に進む

next はメソッドの中には入らずに次の行へ進みます。メソッド内部を追いたい場合は step を使います。


まとめ

コマンド 用途
next / n 次の行へ(メソッドに入らない)
step / s 次の行へ(メソッドの中に入る)
continue / c 次のbinding.pryまで再開
exit pryを終了
whereami 現在位置を表示
ls メソッド・変数一覧
cd コンテキスト切り替え
show-source ソースコードを表示

基本コマンドに慣れたら「Rails binding.pry実践:コントローラー・モデル・テストでのデバッグ」で具体的な使い方を確認してみてください。