29
7

【初心者向け】binding.pryの使い方

Posted at

まえがき

初めてbinding.pryを使ってデバッグをしようとしている方向けにわかりやすく使い方を書いたのでぜひ参考にしてみてください!
binding.pryを使えるようになると、バグの原因特定やアプリケーションの動きがわかるようになるなどのメリットが多いので、必須でできるようにした方がいいものです。この記事を読んでできるようになったら嬉しいです。

目次

  • 設定方法
  • binding.pryを挟む場所
  • おまけ

設定方法

pryのインストール

Gemfileに以下のように追加します。

gem 'pry'
gem 'pry-rails'

その後、bundle installを実行します。

あとはbinding.pryを挟んで使用するだけ!

binding.pryを挟む場所

1. メソッドの最初

  • メソッドの開始直後に挟むことで、そのメソッドが呼び出された際の引数やインスタンス変数の状態を確認できます。
def create
  binding.pry
  @learning_datum = current_user.learning_data.new(learning_data_params)
  if @learning_datum.save
    redirect_to @learning_datum, notice: 'Learning data was successfully created.'
  else
    render :new
  end
end

2. 条件分岐の前後

  • ifunlessなどの条件分岐の前後に挟むことで、条件が正しく評価されているか、分岐前後での値の変化を確認できます。
def create
  @learning_datum = current_user.learning_data.new(learning_data_params)
  binding.pry
  if @learning_datum.save
    binding.pry
    redirect_to @learning_datum, notice: 'Learning data was successfully created.'
  else
    binding.pry
    render :new
  end
end

3. データベース操作の前後

  • save, update, destroyなどのデータベースに影響を与える操作の前後に挟むと、その操作が正しく行われるか確認できます。
def update
  binding.pry
  if @learning_datum.update(learning_data_params)
    redirect_to @learning_datum, notice: 'Learning data was successfully updated.'
  else
    render :edit
  end
end

4. ループの中

  • ループの中に挟むと、各反復ごとに処理を止めて状態を確認できます。特に、ループ処理が期待通りに動作しているか確認したいときに有効です。
def calculate_totals
  @totals = {}
  learning_data.each do |data|
    binding.pry
    @totals[data.category_id] ||= 0
    @totals[data.category_id] += data.time
  end
end

5. エラーが発生している箇所

  • エラーが発生していると予想される箇所やエラーを捕捉している箇所に挟むと、原因の特定に役立ちます。
def show
  @learning_datum = LearningDatum.find(params[:id])
  binding.pry
rescue ActiveRecord::RecordNotFound => e
  binding.pry
  redirect_to root_path, alert: 'Learning data not found.'
end

6. コールバックやフック

  • before_action, after_action, around_actionなどのコールバックやモデルのbefore_save, after_createなどに挟むと、コールバックが期待通りに動作しているか確認できます。
before_action :set_learning_datum, only: [:show, :edit, :update, :destroy]

def set_learning_datum
  binding.pry
  @learning_datum = LearningDatum.find(params[:id])
end

7. フォームデータの検証時

  • フォームから送信されたパラメータが適切に受け取れているか、またはバリデーションが正しく行われているかを確認したい場合に有効です。
def learning_data_params
  binding.pry
  params.require(:learning_data).permit(:category_id, :skill, :time, :month)
end

おまけ

唐突ですが弊社のご紹介もさせてください。

▼ コーポレートサイト
https://prum.jp/

▼ Wantedly求人
https://www.wantedly.com/projects/626662

弊社メンバーは学習した内容を日々Qiitaの記事にアウトプットしております。
弊社にご興味のある方、まずは求人を見てみてください!
ご応募お待ちしておりますー!

29
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
7