在开发模式下,Rails3不会在lib中重新加载代码

时间:2010-10-25 20:52:38

标签: ruby-on-rails ruby-on-rails-3 autoload

情况:

  1. 我在lib/foo/bar.rb中有代码,其中包含一个简单的方法:

    module Foo
      class Bar
        def test
          "FooBar"
        end
      end
    end
    
  2. 在我的助手FooBarHelper中,我有:

    require `lib/foo/bar`
    module FooBarHelper
      def test_foo_bar
        fb = Foo::Bar.new
        fb.test
      end
    end
    
  3. 在我看来,我这样称呼这个辅助方法:

    <%= test_foo_bar =>
    
  4. 在我的config/environments/development.rb中,我将目录添加到config.autoload_paths

    config.autoload_paths += ["#{config.root}/lib/foo"]
    

  5. 问题:

    当我将Foo::Bar.test的返回值更改为"MODIFIED FOOBAR"时,原始返回值"FooBar"仍在视图中显示,而不是新值。

    由于我处于开发模式,代码不应该在每次请求时重新加载代码吗?

    有人能告诉我我错过了什么吗?

    谢谢!

4 个答案:

答案 0 :(得分:25)

以前的答案不起作用。这是一个有效的工作:http://ileitch.github.com/2012/03/24/rails-32-code-reloading-from-lib.html

你必须同时使用两者:

config.watchable_dirs['lib'] = [:rb]

require_dependency

但任何基于config.autoload_paths的解决方案都无法在Rails中运行〜&gt; 3.2

答案 1 :(得分:9)

他们删除了Rails 3中app根的lib文件夹。

您可以将其添加回来
config.autoload_paths << 'lib'
或者您可以在助手中使用`require_dependency`。
module FooBarHelper
  require_dependency 'foo/bar'

  def test_foo_bar
    fb = Foo::Bar.new
    fb.test
  end
end

两种方式都告诉Rails你的文件lib/foo/bar.rb应该被自动加载,然后重新加载每个请求。

答案 2 :(得分:2)

在rails3中故意禁用lib文件夹中的自动加载代码,有关详细信息,请参阅此ticket

Samuel建议的解决方法是一个很好的开始,但我发现某些环境仍然难以在测试环境中找到库(比如从黄瓜场景中调用),并且包括根路径,如ticket并在application.rb的原始评论中暗示是一种更强大的方法:

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

答案 3 :(得分:-1)

为什么要将require放入模块中,当使用autoload_path时根本不需要文件,它应该没有工作,我想如果你之后手动要求文件,rails不知道何时加载又一次?

这样的事情:

require `bar`

module FooBarHelper

  def test_foo_bar
    fb = Foo::Bar.new
    fb.test
  end

end

应该可以工作,不需要在模块中有要求。