14

情况:

  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"]
    

问题:

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

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

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

谢谢!

4

4 回答 4

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 中工作 ~> 3.2

于 2012-04-25T13:20:24.053 回答
9

他们删除了libRails 3 中应用程序根目录的文件夹。

您可以将其添加回来
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应该被自动加载,然后重新加载每个请求。

于 2010-10-26T02:54:01.077 回答
2

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

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

config.autoload_paths += %W(#{config.root}/lib)
于 2010-11-24T05:09:05.110 回答
-1

为什么将 require 放入模块中,当使用 autoload_path 时,您根本不需要 require 文件,它应该可以在没有的情况下工作,我认为如果您之后手动 require 文件,rails 不知道何时再次加载它?

像这样的东西:

require `bar`

module FooBarHelper

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

end

应该可以工作,不需要在你的模块中使用。

于 2010-10-25T23:07:40.733 回答