Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

`const_missing': uninitialized constant (NameError)

Every time I try to run any class from my rails 2.2 app's lib directory using "script/runner -e production ClassName.run" I get the following error:

/usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/commands/runner.rb:47:  
/usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:89:in `const_missing': uninitialized constant ClassName (NameError)"

For some reason I don't get this error when I run it as test instead of production, and everything works fine.

O yeah run is a class method i.e. def self.run .... end

Any suggestions?

like image 993
chaostheory Avatar asked Feb 24 '09 05:02

chaostheory


People also ask

What is an uninitialized constant?

The Uninitialized Constant error is a variation of a regular NameError exception class. It has several possible causes. You'll see this error when the code refers to a class or module that it can't find, often because the code doesn't include require, which instructs the Ruby file to load the class.

What is name error in Ruby?

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.


2 Answers

That error occurs when ruby can't find a Class or Module. I'd start out by:

  1. Checking gem dependencies (are they same for all environments?)
  2. Search your code for anything that defines ClassName, particularly Modules, Classes and plugins.
  3. disable each of your plugins in dev, does any plugin suddenly cause that error?
  4. if the code is in a lib add the lib require statement to your production.rb to force the lib to be loaded in production.

Hope that helps.

update Just to summarise the comments it was option 4.

Unless you only want to load the lib in production you should think about making sure all environments load the lib by doing one of the following:

  1. Create a rails initializer (a .rb file under config/initializers) with the require in it
  2. Add the path to the lib in config/environment.rb by enabling and modifying the config.load_paths variable.
like image 89
robertpostill Avatar answered Sep 30 '22 20:09

robertpostill


I had multiple class definition(all STI classes) on the same file. and when I separated the definition into their respective files, It works

like image 24
Ggmon Avatar answered Sep 30 '22 22:09

Ggmon