THE SITUATION:
I have code in lib/foo/bar.rb
with a simple method defined as such:
module Foo
class Bar
They removed the lib
folder the app root in Rails 3.
config.autoload_paths << 'lib'
or you can use `require_dependency` in your helper.
module FooBarHelper
require_dependency 'foo/bar'
def test_foo_bar
fb = Foo::Bar.new
fb.test
end
end
Both ways tell Rails that your file lib/foo/bar.rb
should be autoloaded and subsequently, reloaded each request.
Why are you putting the require into the module, when using autoload_path you should not need to require the file at all, it should be working without, I think if you manually require the file afterwards, rails does not know when to load it again?
Something like this:
require `bar`
module FooBarHelper
def test_foo_bar
fb = Foo::Bar.new
fb.test
end
end
should work, no need for having the require inside your module.
Previous answers does not work. Here is a working one: http://ileitch.github.com/2012/03/24/rails-32-code-reloading-from-lib.html
You have to use both:
config.watchable_dirs['lib'] = [:rb]
and
require_dependency
but any config.autoload_paths
based solution won't work in Rails ~> 3.2
Autoloading code from the lib folder was intentionally disabled in rails3, see this ticket for more details.
The workaround suggested by Samuel is a great start, however I found that certain environments still had difficulty finding the libraries in a testing environment (say being invoked from a cucumber scenario), and that including the root path, as suggested within the ticket and hinted by the original comment in application.rb was a more robust approach:
config.autoload_paths += %W(#{config.root}/lib)