15
votes

I have a class ConstData:

class ConstData

  US_CITIES = ['miami', 'new york']

  EUROPERN_CITIES = ['madrid', 'london']

end

Its stored under /lib/const_data.rb

The idea is that inside a model, controller or view I can do:

ConstData::US_CITIES to get the US_CITIES etc

Rails should load this class automatically, I got this from: http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/662abfd1df9b2612?hl=en

However this does not work. Can anyone explain me how to accomplish this ?

4

4 Answers

48
votes

The post @daniel refers to is from 2008. Rails has changed since then.
In fact, quite recently. Rails3 doesn't load the lib/ directory automatically.

You can reactivate it quite easily though. Open config/application.rb And add, in the config (in the Application class) the followin :

config.autoload_paths += %W(#{config.root}/lib)

Then your lib/ dir will be autoloaded.

13
votes

The reason autoload_paths didn't work for you and you were forced to do:

Dir["lib/**/*.rb"].each do |path|
  require_dependency path
end

is because you forgot to namespace your class.

lib/awesome/stuffs.rb should contain a class/module like this:

class/module Awesome::Stuffs
....

but you had:

class/module Stuffs
....

Rails can only autoload classes and modules whose name matches it's file path and file name.

:)

2
votes

config.autoload_paths did not work for me. I solved it by putting the following in ApplicationController:

Dir["lib/**/*.rb"].each do |path|
  require_dependency path
end
1
votes

Follow the solution for lib dir be autoloaded:

Remove config.threadsafe! from development.rb and production.rb;

Add in config/application.rb:

config.autoload_paths += %W(#{config.root}/lib)
config.threadsafe!
config.dependency_loading = true