学习Rails现在使用error_highlight来定位存在错误的列

95 阅读1分钟

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的环境中运行时也是如此!

image.png

然而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错误页面。

错误信息现在可以显示错误的细粒度位置,不仅仅是行号,还包括错误代码片段的列范围。

image.png

该PR做了两个重大改变。

  • 使用Exception#backtrace_locations(而不是Exception#backtrace)来提取列信息。
  • 使用ErrorHighlight.spot来识别错误的列。