情况:
我在lib/foo/bar.rb
中有代码,其中包含一个简单的方法:
module Foo
class Bar
def test
"FooBar"
end
end
end
在我的助手FooBarHelper
中,我有:
require `lib/foo/bar`
module FooBarHelper
def test_foo_bar
fb = Foo::Bar.new
fb.test
end
end
在我看来,我这样称呼这个辅助方法:
<%= test_foo_bar =>
在我的config/environments/development.rb
中,我将目录添加到config.autoload_paths
:
config.autoload_paths += ["#{config.root}/lib/foo"]
问题:
当我将Foo::Bar.test
的返回值更改为"MODIFIED FOOBAR"
时,原始返回值"FooBar"
仍在视图中显示,而不是新值。
由于我处于开发模式,代码不应该在每次请求时重新加载代码吗?
有人能告诉我我错过了什么吗?
谢谢!
答案 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
应该可以工作,不需要在模块中有要求。