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
を用いるようになった
概要
元サイトの許諾を得て翻訳・公開いたします。
参考: 週刊Railsウォッチ(20220920) Ruby 3.1のerror_highlight機能でエラー発生位置が詳しく表示されるようになった
#45818は、現時点ではmainブランチにのみマージされており、7-0-stableブランチには含まれていません。また、error_highlightはRuby 3.1以降でのみ有効になります。