【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】Railsアップグレードまとめ
# はじめに Ruby on Railsに限らず、何らかのフレームワークを使ってWebシステムを構築している場合、フレームワークのアップグレード作業は避けて通れません。 一般的にフレームワークはバージョン毎にEOL (End of Life [...]
2022年10月1日 14:32
【Rails】ユーザー登録時に行うメールアドレス認証機能の実装方法
# はじめに ユーザー登録/解除やログイン/ログアウトといった認証機能の導入に「devise」というGemを使っている人は多いと思います。「devise」では以下のように記述するだけで、ユーザー登録時に確認メールを送付しメールアドレス認証を行う機 [...]
2022年9月24日 14:24
【Rails】モデルに列挙型(enum)を定義し、使いこなす方法
# はじめに Railsはモデルでカラム名と同名の列挙型(enum)を定義することで、カラムと列挙型の変数を紐付けることができます。カラムと列挙型の変数を紐付けると、カラムに対して様々な便利な使い方ができるようになります。 本記事では、モデ [...]
2022年9月3日 10:29
【Rails】RailsでCORSとPreflight requestの設定を行う方法
# はじめに RailsアプリをAPIサーバーとして構築するには、CORS (Cross-Origin Resource Sharing)と Preflight requestの設定を行う必要があります。APIサーバーは外部からの要求に対して処理 [...]
2022年8月27日 10:44
【Ruby】Bundlerを使ってRubyGemsを作成/公開する方法
# はじめに Bundlerを使ってRubyGemsを作成および公開する方法について説明します。Bundlerを使わずにRubyGemsを作成/公開する方法については以下の記事を参照してください。 <iframe class="hatena [...]
2022年7月12日 23:18
【Ruby】RubyGemsを作成/公開する方法
# はじめに RubyGemsを作成および公開する方法について説明します。Bundlerを使ってRubyGemsを作成する方法については以下の記事を参照してください。 <iframe class="hatenablogcard" style [...]
2022年7月11日 21:52
【Rails】M1チップ搭載MacでRuby on Railsの開発環境構築
# はじめに M1チップ搭載MacにRuby on Railsの開発環境を構築する手順を記載します。 - MacBook Air (M1, 2020) - macOS Monterey 12.3.1 # Homebrew ## [...]
2022年5月5日 11:56
【Rails】Rakeタスクの基本情報と作成・実行方法
# はじめに Railsには標準でRakeというGemが同梱されています。RakeはRubyで実装されたMake(UNIX系のOSで使用できるコマンド)のようなビルド作業を自動化するツールです。Ruby Make、略してRakeというわけですね。 [...]
2022年3月7日 22:12