Adding lib to 'config.autoload_paths' in Rails 3 does not autoload my module
I place a file name g.rb in side Rails.root/lib
folder
The file content is like this:
module Google
end
Then I add
config.autoload_paths += %W(#{config.root}/lib #{Rails.root}/app/delayed_jobs)
to my Rails.root/config/application.rb
However, when I try to invoke Google from rails console
, an exception is thrown. The exception goes away only if I execute require 'google'
.
Why? Shouldn't my file is autoloaded and shouldn't I access the module without any extra require
statement?
Hmm, I discovered an interesting thing. In order for Rails to auto load my class, the class name should be compliant to the file name and the folder structure.
For example, if I want to have Google module autoloaded, I must placed it inside google.rb
, directly under /lib (incase I specify autoload from /lib).
If I want to auto load Google::Docs
, then I either place it inside google.rb
or google/docs.rb
I had a similar problem with getting my module to run on Heroku. In addition to the autoload naming convention stated by Stephen C, I found out that the module code must be require
'd due to a threadsafe
assumption made by the Rails' production environment on Heroku (even though threadsafe
was commented out in my production.rb
configuration file.) As soon as I require
'd the module file before calling include
on the module, everything started to work.
require 'mymodule'
include Mymodule
Please take a look at this excellent article on the subject of getting Modules to load correctly in Heroku (production).