开发者

Rails 3 autoload

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 t开发者_开发问答o 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 ?


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.


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.

:)


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


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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜