【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】GitHubのセキュリティアラートで発見された脆弱性を解消する方法
# はじめに GitHubにはセキュリティアラートという機能があります。セキュリティアラートはリポジトリに含まれるライブラリやパッケージの脆弱性を定期的にチェックし、脆弱性のあるライブラリやパッケージが発見されたらアラートで知らせてくれるという機 [...]
2022年1月16日 10:36
【Rails】devise-two-factorを使った2段階認証の実装方法【初学者】
# はじめに Railsアプリで2段階認証を実装するには、「rotp」というGemを使う方法の他に、「devise-two-factor」というGemを使う方法があります。「devise-two-factor」はその名の通り、IDとパスワードによ [...]
2021年12月12日 17:58
【Rails】rotpを使った2段階認証の実装方法【初学者】
# はじめに 昨今はIDとパスワードによる認証だけでなく、ワンタイムパスワードによる2段階認証を導入するWebアプリが増えてきました。Railsで作成したWebアプリでも、IDとパスワードによる認証に加えて2段階認証を導入するニーズが高まっていま [...]
2021年11月27日 13:02
【Rails】deviseを使った認証機能の実装【初学者】
# はじめに Railsアプリに認証機能を導入するには「devise」というGemを使う方法が最も簡単です。「devise」は認証に係る機能をほとんどコードを書くことなく実装できる反面、処理がブラックボックス化されており、全容が把握しづらいという [...]
2021年11月27日 13:01
【Rails】IDとパスワードによる認証機能の実装【初学者】
# はじめに 大抵のWebアプリでは、ユーザー登録/解除、ログイン/ログアウトといった認証機能を持っています。Railsには簡単に認証機能を導入できる「device」というGemが用意されています。「devise」は多くのRailsアプリで使われ [...]
2021年11月27日 13:00