Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 7: エラー発生位置をわかりやすく示すerror_highlightが導入された(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

参考: 週刊Railsウォッチ(20220920) Ruby 3.1のerror_highlight機能でエラー発生位置が詳しく表示されるようになった

#45818は、現時点ではmainブランチにのみマージされており、7-0-stableブランチには含まれていません。また、error_highlightはRuby 3.1以降でのみ有効になります。

Rails 7: エラー発生位置をわかりやすく示すerror_highlightが導入された(翻訳)

Ruby 3.1で導入されたerror_highlightと呼ばれる新機能によって、エラーが発生した位置を正確に表示できるようになりました。

Railsの標準的なエラー画面にはエラーが発生した行が表示されます。これはほとんどの場合で便利なものですが、エラーの種類によってはこの情報だけでは足りないこともあります。

たとえばハッシュを要素に含むハッシュで考えてみましょう。存在しないキーにアクセスしたときに、どこでそのキーに誤ってアクセスしたかを突き止めるのは多くの場合困難です。

以下の例を見てみましょう。

hash = { jane: { name: "Jane", age: "25", city: "NYC" }}
hash[:john][:age]

上のコードで以下のようなエラーが発生します。

NoMethodError: undefined method `[]` for nil:NilClass

しかしこのエラーメッセージでは、:johnが存在しないのかどうか、あるいはハッシュそのものが存在しないのかどうかまではわかりません。

改修前

RailsをRuby 3.1環境で実行しても、Ruby 3.1で導入されたerror_highlightは使われていませんでした。

しかしRailsのログには正確なエラー発生位置が出力されています。

NoMethodError (undefined method `[]' for nil:NilClass

    hash[:john][:age]
               ^^^^^^):
app/controllers/application_controller.rb:4:in `home'

改修後

Ruby 3.1から利用可能になったerror_highlightがRailsのエラー画面に直接表示されるようになりました(#45818)。

エラーが発生した行のほかに、その行でエラーが発生した範囲もエラー画面のコード片で精密に表示されるようになりました。

このプルリクでは大きな変更が2つ行われています。

  • エラー発生場所を取り出すのにException#backtraceではなくException#backtrace_locationsを用いるようになった
  • エラー発生位置の特定にErrorHighlight.spotを用いるようになった

関連記事

Ruby 3.1: error_highlight gemが追加された(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。