【Rails】Railsアプリのデバッグ《byebug篇》

はじめに

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の使い方を覚えていただければと思います。

関連記事

【Rails】RSpecを使った自動テスト《システムスペック編》
# はじめに Railsでアプリケーションを開発する際、品質を担保するためにテストは欠かせません。その中でも、RSpecは多くの開発者に愛用されているテストフレームワークです。 今回は、RSpecを使ったRailsアプリケーションのテスト方 [...]
2024年7月11日 17:07
【Rails】RSpecを使った自動テスト《リクエストスペック編》
# はじめに Railsでアプリケーションを開発する際、品質を担保するためにテストは欠かせません。その中でも、RSpecは多くの開発者に愛用されているテストフレームワークです。 今回は、RSpecを使ったRailsアプリケーションのテスト方 [...]
2024年7月11日 16:06
【Rails】RSpecを使った自動テスト《コントローラースペック編》
# はじめに Railsでアプリケーションを開発する際、品質を担保するためにテストは欠かせません。その中でも、RSpecは多くの開発者に愛用されているテストフレームワークです。 今回は、RSpecを使ったRailsアプリケーションのテスト方 [...]
2024年7月11日 15:39
【Rails】RSpecを使った自動テスト《モデルスペック編》
# はじめに Railsでアプリケーションを開発する際、品質を担保するためにテストは欠かせません。その中でも、RSpecは多くの開発者に愛用されているテストフレームワークです。 今回は、RSpecを使ったRailsアプリケーションのテスト方 [...]
2024年7月11日 11:50
【Rails】RSpecを使った自動テスト《基本編》
# はじめに Railsでアプリケーションを開発する際、品質を担保するためにテストは欠かせません。その中でも、RSpecは多くの開発者に愛用されているテストフレームワークです。 今回は、RSpecを使ったRailsアプリケーションのテスト方 [...]
2024年7月10日 17:49
【Rails】デザインパターン「Concern」の基本情報と実装方法
# はじめに Ruby on RailsなどのMVCフレームワークで構築したWebシステムにはアンチパターンというものが存在します。システム開発におけるアンチパターンとは、避けるべき悪い設計や実装方法のことを指します。 MVCフレームワーク [...]
2024年7月10日 13:32
【Rails】デザインパターン「Form Object」の基本情報と実装方法
# はじめに Ruby on RailsなどのMVCフレームワークで構築したWebシステムにはアンチパターンというものが存在します。システム開発におけるアンチパターンとは、避けるべき悪い設計や実装方法のことを指します。 MVCフレームワーク [...]
2024年7月6日 22:50
【Rails】デザインパターン「Service Object」の基本情報と実装方法
# はじめに Ruby on RailsなどのMVCフレームワークで構築したWebシステムにはアンチパターンというものが存在します。システム開発におけるアンチパターンとは、避けるべき悪い設計や実装方法のことを指します。 MVCフレームワーク [...]
2024年7月6日 19:59