pry-byebug を使ってRailsアプリをデバックする方法

# はじめに

特にプログラミングを始めた最初のうち、エラーの修正に手こずり、エラーの原因の特定が最初は難しく感じるかもしれません。そんな時のために、Rubyでは、`pry-byebug`と呼ばれるデバッガと呼ばれる、バグを修正するためのツール（`gem`）が用意されています。

[github | pry-byebug](https://github.com/deivid-rodriguez/pry-byebug)

アンケートを見ても`pry-byebug`が一番人気そうですね。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">Ruby/Railsプログラマのみなさんにアンケートです。RubyやRailsでデバッグするときは、どのデバッガを使っていますか？（最もよく使うものを選択）<br>選択肢になければリプライで回答をお願いします～。</p>&mdash; Junichi Ito (伊藤淳一) (@jnchito) <a href="https://twitter.com/jnchito/status/819356682497032196?ref_src=twsrc%5Etfw">January 12, 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


また、現在（2018年6月12日時点）、既に、1900万はDLされてますね。

https://rubygems.org/gems/pry-byebug/versions/3.4.0

ということで、今日は、`pry-byebug`の導入法と基本的な使い方を紹介します。

# 環境

この記事では以下の環境（2018年6月12日時点）で動作確認できました。

- Ruby: 2.4.1
- Rails: 5.0.7
- pry-byebug: 3.6.0

# pry-byebugのインストール方法

Railsのプロジェクトの`Gemfile`に以下のように記述します。

```ruby:Gemfile
gem 'pry-byebug', group: :development
```

追記してファイル保存したら、`bundle install`してインストール完了です。

# pry-byebugの使い方

基本は**コード中にブレークポイントを書いて、デバッグモードにする**ことです。

デバッグをしたい箇所をブレークポイントとして、`binding.pry`を記述するだけです。`View`ファイルでは`<% binding.pry %>`のように記述します。

たとえば、メッセージボードで、ユーザー情報をモデルに渡してDB保存するコントローラの`create`アクション（メソッド）で、パラメータを確認したいという場合。

```ruby:app/controllers/users_controller.rb
def create
  @user = User.new(user_params)

  binding.pry
  
  if @user.save
    flash[:success] = 'ユーザーを登録しました'
    redirect_to @user
  else
    flash[:danger] = 'ユーザーを登録しました'
    render :new
  end
end
```

4行目あたりに`binding.pry`があるのがわかりますか？では、Railsサーバを起動して、試しにユーザー登録をしてみます。

![スクリーンショット 2018-06-12 11.49.56.png](https://qiita-image-store.s3.amazonaws.com/0/14191/3274a50e-969e-741e-c2fe-22a541fe4957.png)

全て入力した後、「Sign up」を、クリックしたら`create`アクションに入るので、上記の`binding.pry`のブレークポイントで処理が止まります。

```bash
From: /home/ec2-user/environment/microposts/app/controllers/users_controller.rb @ line 19 UsersController#create:

    14: def create
    15:   @user = User.new(user_params)
    16: 
    17:   binding.pry
    18:   
 => 19:   if @user.save
    20:     flash[:success] = 'ユーザーを登録しました'
    21:     redirect_to @user
    22:   else
    23:     flash[:danger] = 'ユーザーを登録しました'
    24:     render :new
    25:   end
    26: end

[1] pry(#<UsersController>)> @user
=> #<User:0x007f76c6026360 id: nil, name: "namae", email: "test@gmail.com", password_digest: "$2a$10$OWIqmjdKx/obwOquxDZLBenUmsu3o2KNT9Vscl2mLqU4ZP/WjTlNG", created_at: nil, updated_at: nil>
```

試しに`@user`と入力したら、それまでに入力した値などが出力されています。

```bash
[2] pry(#<UsersController>)> user_params
=> <ActionController::Parameters {"name"=>"namae", "email"=>"test@gmail.com", "password"=>"pass", "password_confirmation"=>"pass"} permitted: true>

[3] pry(#<UsersController>)> new
=> #<User:0x007f76c5bacc80 id: nil, name: nil, email: nil, password_digest: nil, created_at: nil, updated_at: nil>

[4] pry(#<UsersController>)> User
=> User(id: integer, name: string, email: string, password_digest: string, created_at: datetime, updated_at: datetime)
```

他も試しに入力して見ましょう。

- `user_params`メソッド：このメソッドは出力制限されてないものだけ出すメソッドで、見事フィルタリングされて出力されています
- `new`メソッド：モデルに入力したテーブル構造が`nil`で出力されました
- `User`モデル：モデルに入力したテーブル構造が出力されました

こんな感じでデバックするのか、とわかるかと思います。

# pry-byedebugで使えるコマンド

デバック（`pry-byedebug`）に使えるコマンドを4つ紹介します。

| コマンド | 機能 |
|-----------|------------|
| next       | 次の行（コマンド）を実行        |
| step     | 次の行かメソッド内に入る      |
| continue ( Ctrl + D)      | プログラムの実行をcontinueしてpryを終了する        |
| finish         | 現在のフレームが終わるまで実行          |
| $         | 現在のソースを表示          |

仮に、`View`側に戻ってエラーがでるような内容をフォームに入力をした場合（空入力など）、そんな時は、コマンドの`next`で進めていくと、if文中の`else`内に入って実行していくのがわかります。

---

以上です！

# この記事を読んだ方に

この記事を読んで、誤っている箇所をみつけたり、追記した方がいい内容などありましたら、編集リクエストやコメント欄で指摘していただけると助かります。



# 参考

- https://github.com/deivid-rodriguez/pry-byebug
- https://www.sejuku.net/blog/21559
- https://k0kubun.hatenablog.com/entry/2015/11/07/000413
- https://rubygems.org/gems/pry-byebug/versions/3.4.0
- [【Rails】pryを使ってデバックする](http://liberta-web.com/blog/%E3%80%90rails%E3%80%91ply%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%87%E3%83%90%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B/)
- [Rails デバッグの為にpryを使いこなす](https://doruby.jp/users/takeshita/entries/Rails-%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%AE%E7%82%BA%E3%81%ABpry%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%99)
- https://qiita.com/AknYk416/items/6f0bec58712edaf4940e
- https://blog.toshimaru.net/rails-pry-byebug/
- https://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f