Project

General

Profile

Actions

Feature #16832

closed

Use #name rather than #inspect to build "uninitialized constant" error messages

Added by byroot (Jean Boussier) over 4 years ago. Updated over 4 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:98147]

Description

While debugging a bug in Rails (https://github.com/rails/rails/pull/37632#issuecomment-623387954) I noticed NameError calls inspect on the const_get receiver to build its error message.

The problem is that some libraries such as Active Record have been redefining inspect for years to provide human readable information, e.g.:

>> Shipit::Stack.inspect
=> "Shipit::Stack (call 'Shipit::Stack.connection' to establish a connection)"
>> Shipit::Stack.connection; nil
>> Shipit::Stack.inspect
=> "Shipit::Stack(id: integer, environment: string, ...)"

Which makes for fairly unhelpful error messages:

>> Shipit::Stack.const_get(:Foo)
Traceback (most recent call last):
        2: from (irb):4
        1: from (irb):4:in `const_get'
NameError (uninitialized constant #<Class:0x00007fc8cadf2dd0>::Foo)

So perhaps it's Active Record that is at fault here, but from my understanding since the goal is to display the constant path that was requested, name is much more likely to return a relevant constant name.

Proposed patch: https://github.com/ruby/ruby/pull/3080

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0