» What's in a Name?

NameError is raised when you reference a constant or a variable which isn't defined in the current context. A ruby constant can be a Module, Class, or a CONSTANT_VARIABLE, and must always start with an upper case letter.

You may encounter NameError when:

There is a typo in your variable name, class name, module name or constant name.

The file with the class definition isn't loaded in the current context.

The rubygem which defines these constants is not loaded.

Full name of the constant not being used, e.g., when you use PI instead of Math::PI

Another instance of this occurs when you try to define a constant starting with a lower case letter.

irb > SecureRandom . uuid NameError : uninitialized constant SecureRandom Did you mean? SecurityError

Fixing it with a require .

require 'securerandom' SecureRandom . uuid # => "22fb1159-5241-4a5c-a3ff-12579f13fb37"

Aray . new # => NameError: uninitialized constant Aray # => Did you mean? Array

Fixing it with the correct spelling:

irb > Array . new # => []

module Config module Site NAME = "spongebob" end def self . print_name puts NAME end end Config . print_name # => ...:19:in `print_name': uninitialized constant Config::NAME (NameError) # => ...:23:in `<main>'

Fixing it with the correct path:

module Config module Site NAME = "spongebob" end def self . print_name puts Site :: NAME end end Config . print_name # => spongebob

» Easier Debugging Using did_you_mean

did_you_mean is a nifty gem which helps you when you run into NameError because of typos. The gem is included by default in Ruby 2.3 and later. If you use an older version of Ruby, include did_you_mean in your Gemfile to help you debug better:

Fle . readlines "/tmp/x" # => NameError: uninitialized constant Fle # => Did you mean? File

did_you_mean also helps when you run into a NoMethodError.

» Conditionally Referencing Constants

Sometimes you may want to know if a constant is loaded and do things conditionally. For instance, if you want to execute a chunk of code if the constant Rails is defined, you can use the defined? function: