Ruby 3.1引入了一个新的功能,叫做error_highlight ,它允许你精确地指出出现错误的那一列。
Rails中的标准错误信息显示错误发生的行。 这在大多数情况下是有用的,然而,对于某些类型的错误,它可能会变得不太有用。
例如,考虑一个哈希的哈希。 如果访问一个不存在的键,通常很难确定键被错误地访问的位置。
考虑一下下面的例子。
hash = { jane: { name: "Jane", age: "25", city: "NYC" }}
hash[:john][:age]
上面的代码将引发一个错误,如:
NoMethodError: undefined method `[]` for nil:NilClass
然而,它并没有说明键:john 是不存在还是哈希值本身不存在。
之前
尽管Ruby 3.1有error_highlight 的功能,但Rails并没有使用它。即使Rails应用在3.1的环境中运行时也是如此!
然而Rails的日志显示了错误发生的确切位置。
NoMethodError (undefined method `[]' for nil:NilClass
hash[:john][:age]
^^^^^^):
app/controllers/application_controller.rb:4:in `home'
之后
感谢这个PR,它将error_highlight (从Ruby 3.1开始可用)直接引入Rails错误页面。
错误信息现在可以显示错误的细粒度位置,不仅仅是行号,还包括错误代码片段的列范围。
该PR做了两个重大改变。
- 使用Exception#backtrace_locations(而不是Exception#backtrace)来提取列信息。
- 使用ErrorHighlight.spot来识别错误的列。