情况:
我在lib/foo/bar.rb
有代码, 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"
仍然显示在视图上而不是新值。
由于我处于开发模式,代码不应该在每个请求上重新加载代码吗?
有人能告诉我我错过了什么吗?
谢谢!
以前的答案不起作用。 这是一个有效的工作: 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
他们删除了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
应该被自动加载,然后重新加载每个请求。
为什么要将require放入模块中,当使用autoload_path时根本不需要文件,它应该没有工作,我想如果你之后手动要求文件,rails不知道何时再加载它?
像这样的东西:
require `bar`
module FooBarHelper
def test_foo_bar
fb = Foo::Bar.new
fb.test
end
end
应该工作,不需要在你的模块内有要求。