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

情况:

  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. 在我看来,我这样调用这个辅助方法:

      
  4. 在我的config/environments/development.rb ,我将目录添加到了config.autoload_paths

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

问题:

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

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

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

谢谢!

他们删除了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应该被自动加载,然后重新加载每个请求。

以前的答案不起作用。 这是一个有效的工作: 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~> 3.2

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

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

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

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

像这样的东西:

 require `bar` module FooBarHelper def test_foo_bar fb = Foo::Bar.new fb.test end end 

应该工作,不需要在您的模块内有要求。