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

2021年5月31日 12:32

はじめに

Railsアプリの開発中になんらかのエラーが発生すると、デフォルトでは以下のような画面が表示されます(画像をクリックすると拡大します)。

Railsアプリの開発者なら誰しも一度は見たことがあるこのエラー画面ですが、Better ErrorsというGemを導入すると、より見やすくより使いやすくカスタマイズすることができます。

本記事では、Better Errorsの導入から使い方について説明します。

Better Errorsの表示例

上記のエラー画面をBetter Errorsで表示させた場合の表示例は以下になります(画像をクリックすると拡大します)。全体的にデフォルトのエラー画面より綺麗な配色になっていて見やすくなっています。また、コードにはシンタックスハイライトが適用されていてこちらも見やすくなっています。

Better Errorsの使い方

Better Errorsのインストール

Gemfileに以下を追記してbundle installを行います。デフォルトのエラー画面と同じくBetter ErrorsでもREPL(対話型評価環境)を使うことができます。本番環境で表示されたエラー画面でもREPLが使えてしまうと大変なことになるので、必ず開発環境でのみインストールするようにしてください。

binding_of_callerはBetter Errorsの高度な機能(REPL、変数の検査、スタックフレーム名)に必要なので併せてインストールします。

group :development do
  # 以下を追記
  gem "better_errors"
  gem "binding_of_caller"
end

Better Errorsの画面構成

Better Errorsをインストールするだけでエラー画面が変更されます。Better Errorsの画面構成は以下のようになっています。

エラーメッセージ

Railsによって検出されたエラーのエラーメッセージです。マウスカーソルをこのエリアの上に乗せるとエリアが広がりすべてのエラーメッセージが表示されます。

スタックトレース

スタックトレースとは、エラーが発生しているコードの前に実行していたコードの履歴のことです。Better Errorsでは、Application Frames(アプリケーション内のフレーム)とAll Frames(外部Gemやライブラリを含めたすべてのフレーム)を切り替えて表示することができます。

スタックトレース内に表示されているフレームをクリックして選択すると、右側に表示されている情報が選択したフレームのものに置き換わります。

エラー箇所のコード

エラーが発生したコードとその前後数行を表示します。コードはシンタックスハイライトが適用されているので見やすくなっています。

コードの上部に表示されているソースファイルのパスのリンクをクリックするとソースファイルをエディターで開くことができます。デフォルトのエディターはTextMateですが、設定で任意のエディターに変更することができます。エディターの変更については後述する「エディターの変更」セクションを参照してください。

REPL

RailsのREPLはデフォルトでirb (Interactive Ruby) ですが、実験的なオプションとしてPryに変更することもできます。REPLの変更については後述する「REPLの変更」セクションを参照してください。

変数

参照可能な変数の一覧です。すべてのリクエスト変数、ローカル変数、インスタンス変数の一覧と格納されている値を確認することができます(画像はインスタンス変数の途中で切れていますがちゃんと表示されています)。

Better Errorsの設定

エディターの変更

コードの上部に表示されているソースファイルのパスのリンクをクリックしたときに起動するエディターを設定することができます。環境変数$EDITORまたは$BETTER_ERRORS_EDITORにエディターの起動コマンドを設定します。

Better Errorsで使用できるエディターの一覧は以下を参照してください。

今回は例としてエディターをVSCodeに変更してみます。

$ vi ~/.bash_profile

# .bash_profileに以下を追記
export BETTER_ERRORS_EDITOR="code --wait"

$ source ~/.bash_profile

Better Errorsのエラー画面でソースファイルのパスのリンクをクリックすると以下のようなメッセージが表示されるようになります(設定が有効にならない場合、Railsサーバーを起動しているターミナルを再起動してみてください)。

Railsアプリごとに使用するエディターを分けたい場合、環境変数ではなくBetter Errorsの設定ファイルを作成することでもエディターを変更することができます。config/initializers/ディレクトリ配下にbetter_errors.rbを作成し、以下を記述します。

if defined?(BetterErrors)
  BetterErrors.editor = "vscode://file/%{file}:%{line}"
end

Railsサーバー(またはRailsサーバーを起動しているターミナル)を再起動すると設定が反映されます。

REPLの変更

Better ErrorsのREPLはirb (Interactive Ruby) ですが、これをPryに変更することができます。config/initializers/ディレクトリ配下にbetter_errors.rbを作成し、以下を記述します。

if defined?(BetterErrors)
  BetterErrors.use_pry
end

まとめ

Better ErrorsはRailsのデフォルトのエラー画面をより見やすくより使いやすくカスタマイズしてくれます。個人的な感想ですが、デフォルトのエラー画面はRailsのテーマカラーでもある赤色がふんだんに使われているので、突然表示されると少し心臓に悪い気がします。その点、Better Errorsのエラー画面は色味が抑えられており、かつ配色も美しいので突然のエラー画面に驚くということが減るのではないかと思います。

本記事を参考にして、Better Errorsを導入していただければと思います。

関連記事

【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