はじめに
Ruby on Railsに限りませんが、アプリの開発中にはエラーは付き物です。なにかしらのエラーが発生したときに、エラーの原因を特定しエラー箇所を修正することをデバッグと言います。Railsではデバッグの手助けとなる機能があらかじめ備わっています。
本記事では、「byebug」を使ったデバッグについて説明します。
byebugの使い方
byebugのインストール
Railsアプリを作成した時点でbyebugはインストールされています。作成後にbyebugを削除してしまったなどの理由でインストールされていない場合、Gemfile
に以下を追記してbundle install
を行います。
group :development, :test do
# 以下を追記
gem 'byebug'
end
基本の使い方
byebugの使い方は簡単です。デバッグしたい箇所にbyebug
(またはdebugger
)と追記するだけです。この状態で処理を実行すると、デバッガーにより当該箇所で処理が停止します。
class ArticlesController < ApplicationController
def show
@article = Article.find(params[:id])
# 以下を追記
byebug
end
end
デバッガーにより処理が停止しているときに、シェルに変数名を入力し実行することで中身を確認することができます。変数の型が配列やハッシュの場合、変数名の前にpp
とつけることで変数の中身が見やすい形式で表示されます。
# 変数の中身を表示
(byebug) @article.title
"【Rails】Credentialsを使用した機密情報の保護【初学者】"
# 変数の中身を見やすく表示
(byebug) pp @article.tags
[#<Tag:0x00007fbb3bc073a0
id: 46,
name: "Ruby",
created_at: Fri, 02 Apr 2021 15:14:02 JST +09:00,
updated_at: Fri, 02 Apr 2021 15:14:02 JST +09:00>,
#<Tag:0x00007fbb3bc072d8
id: 3,
name: "Rails",
created_at: Fri, 13 Dec 2019 17:39:28 JST +09:00,
updated_at: Fri, 13 Dec 2019 17:39:28 JST +09:00>,
...
byebugは単なるメソッドのため、条件をつけることができます。
class ArticlesController < ApplicationController
def show
@article = Article.find(params[:id])
# 以下を追記
byebug if @article.draft?
end
end
byebugのコマンド
byebugには様々なコマンドが用意されています。byebugのシェルでhelp
と入力し実行するとすべてのコマンドを確認することができます。また、help
に続けてコマンド名を入力し実行するとそのコマンドの説明が表示されます。
(byebug) help
(byebug) help <command>
byebugのコマンドはたくさんあるので、本記事ではよく使うであろうコマンドのみピックアップして紹介します。すべてのコマンドを確認したい場合は以下のチートシートを参照してください。
continue
continue
(またはcont
またはc
)コマンドは次のブレークポイントまで処理を進めます。次のブレークポイントがない場合は停止することなく最後まで処理を実行します。また、unconditionally
というパラメーターをつけるかコマンドの末尾に!
をつけるとブレークポイントを無視して処理を進めます。このオプションはRailsサーバーを停止するまで継続します。
# 次のブレークポイントまで処理を進める
(byebug) continue
next/step
next
(またはn
)コマンドは次の行まで処理を進めます。関数内の処理はデバッグしません(ステップオーバー)。step
(またはs
)コマンドは次の行まで処理を進めます。関数内の処理もデバッグします(ステップイン)。
# 次の行まで処理を進める(ステップオーバー)
(byebug) next
# 次の行まで処理を進める(ステップイン)
(byebug) step
display/undisplay
display <var>
(またはdisp <var>
)コマンドはブレークポイントのたびに引数で与えられた変数の中身を表示します(変数の監視)。undisplay <num>
(またはundisp <num>
)コマンドは変数の監視設定を削除します。<num>
にはdisplay
コマンドを実行したときに表示される行番号を指定します。
# ブレークポイントのたびに変数の中身を表示
(byebug) display @article
1: @article = nil
# 変数の監視設定を削除
(byebug) undisplay 1
var
var <subcommand>
(またはv <subcommand>
)コマンドは現時点で利用できる変数を確認することができます。
コマンド | 説明 |
---|---|
var all |
すべての変数を表示。 |
var args |
現在のスコープの引数を表示。 |
var const |
定数を表示。 |
var global |
グローバル変数を表示。 |
var instance |
インスタンス変数を表示。 |
var local |
ローカル変数を表示。 |
まとめ
エラー原因を特定し修正するにはデバッグが不可欠です。どこでエラーが発生しているかや変数の中身を確認することがまず第一に行うべきことです。byebugを使えばそれらを簡単に確認することができ、迅速な問題解決の手助けとなります。
本記事を参考にしてbyebugの使い方を覚えていただければと思います。