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

はじめに

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】Paranoiaを使用した論理削除(ソフトデリート)
# はじめに Paranoiaは、Railsアプリケーションで論理削除(ソフトデリート)を実現するためのGemです。 論理削除は、データベースのレコードを物理的に削除するのではなく、削除フラグを設定することで「削除済み」とみなす方法です。こ [...]
2024年7月20日 21:33
【Rails】activerecord-multi-tenantを使用したマルチテナントアプリケーションの作成
# はじめに マルチテナントアプリケーションでは、複数の顧客(テナント)が同じアプリケーションを利用するため、データの分離が必要です。 activerecord-multi-tenantは、このようなマルチテナント環境をサポートするための便 [...]
2024年7月18日 16:50
【Rails】RubyとRailsにおけるattr_reader, attr_writer, attr_accessorの概念と使用方法
# はじめに RubyとRailsの開発において、`attr_reader`,`attr_writer`,`attr_accessor`は非常に便利なメソッドです。これらは、クラス内でインスタンス変数に対するゲッターおよびセッターメソッドを簡単に [...]
2024年7月17日 18:11
【Rails】RubyとRailsにおけるyieldの概念と使用方法
# はじめに RubyとRailsにおける`yield`は、メソッドやテンプレートの中で動的にコードブロックを実行する能力を提供し、これによってコードの再利用性と拡張性が大幅に向上します。本記事では、RubyとRailsにおける`yield`の概 [...]
2024年7月17日 13:15
【Rails】AASMを使用してオブジェクトの状態遷移を効率的に管理
# はじめに Railsアプリケーションにおいて、オブジェクトの状態管理は重要な課題の一つです。AASM (Acts As State Machine) gemは、複雑な状態遷移を効率的に管理します。本記事では、AASMの基本的な使い方を解説して [...]
2024年7月16日 18:00
【Rails】RSpec + Swagger + rswagでアプリケーションのAPIをテストおよびドキュメント化する方法
# はじめに Railsアプリケーションの開発において、APIのテストとドキュメント化は重要な要素です。 RSpecはテストフレームワークとして広く利用されており、SwaggerはAPIの設計とドキュメント化を支援します。これらを統合するr [...]
2024年7月16日 14:27
【Rails】mailcatcherを使用して開発環境でメール送信をテストする方法
# はじめに mailcatcherは、開発環境でのメール送信をキャプチャするためのツールです。ローカルで送信されたメールをブラウザ上で簡単に確認できるようにします。mailcatcherをRailsアプリケーションで使用する方法について説明しま [...]
2024年7月15日 16:37
【Rails】impressionistを使用してページビューやクリック数を追跡する方法
# はじめに impressionist Gemを使用してRailsアプリケーションでページビューやクリック数を追跡する方法について説明します。 # 実装方法 ## impressionist Gemのインストール まず、impre [...]
2024年7月15日 14:18