Rails3 not reloading code in lib while in development mode

后端 未结 4 1000
暖寄归人
暖寄归人 2020-12-13 07:35

THE SITUATION:

  1. I have code in lib/foo/bar.rb with a simple method defined as such:

    module Foo
      class Bar
                 
    
    
            
相关标签:
4条回答
  • 2020-12-13 08:09

    They removed the lib folder the app root in Rails 3.

    You can either add it back
    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.

    0 讨论(0)
  • 2020-12-13 08:17

    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.

    0 讨论(0)
  • 2020-12-13 08:25

    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

    0 讨论(0)
  • 2020-12-13 08:27

    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)
    
    0 讨论(0)
提交回复
热议问题