» 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
- 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
Another instance of this occurs when you try to define a constant starting with a lower case letter.
» 1. Missing Require:
irb> SecureRandom.uuid NameError: uninitialized constant SecureRandom Did you mean? SecurityError
Fixing it with a
require 'securerandom' SecureRandom.uuid # => "22fb1159-5241-4a5c-a3ff-12579f13fb37"
» 2. Typos:
Aray.new # => NameError: uninitialized constant Aray # => Did you mean? Array
Fixing it with the correct spelling:
irb> Array.new # => 
» 3. Incorrect Path:
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 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
if defined?(Rails) # execute this code conditionally when we have a constant called `Rails` # ... end