Ruby
Rails
Gem

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

はじめに

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

github | pry-byebug

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

また、現在(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に以下のように記述します。

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

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

pry-byebugの使い方

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

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

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

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

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

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と入力したら、それまでに入力した値などが出力されています。

[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内に入って実行していくのがわかります。


以上です!

この記事を読んだ方に

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

参考