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

2021年5月29日 15:06

はじめに

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アプリのデバッグ《マルチデバイス篇》
# はじめに 近年のWebアプリはレスポンシブ対応が当たり前になっています。最低でもPCとスマートフォンに対応したデザイン、ときにはその中間のタブレットに対応したデザインなんかも作成する必要があります。 Webアプリの開発はPCを使って行う [...]
2021年5月23日 13:02
【Rails】Railsアプリのデバッグ《Better Errors篇》
# はじめに Railsアプリの開発中になんらかのエラーが発生すると、デフォルトでは以下のような画面が表示されます(画像をクリックすると拡大します)。 <a class="gallery" data-group="gallery" href [...]
2021年5月22日 19:42
【Rails】レンダリング(renderメソッド)でアンカー指定を行う
# はじめに 通常、Railsでアンカー付きのリクエストを発生させるには`redirect_to`を使います。 ```rb redirect_to root_path(anchor: 'target') ``` では、`rende [...]
2021年5月20日 10:47
【Rails】Bundler 2.2.x以降は開発者が適切なプラットフォームを追加する必要がある
# 事象 昔作ったRailsアプリを久しぶりに修正しデプロイしようとしたところ、以下のエラーが出力されました。 ```bash # 実行コマンド Running $HOME/.rbenv/bin/rbenv exec bundle ch [...]
2021年5月18日 16:18
【Rails】Webpackerと互換性のないNode.jsがインストールされているとエラー
# 事象 昔作ったRailsアプリを久しぶりに修正しデプロイしようとしたところ、以下のエラーが出力されました。 ```bash # 実行コマンド Running $HOME/.rbenv/bin/rbenv exec bundle ex [...]
2021年5月18日 15:04