为什么Rails不会在每个请求上刷新类(尽管配置)?

时间:2011-10-11 00:35:32

标签: ruby-on-rails ruby-on-rails-2

我最近每次更改代码时都要重新启动开发服务器。我的development.rb文件仍然有这一行:

config.cache_classes = false

我尝试使用调试器验证此值是否已停留。为此,我将配置设置为environment.rb中的全局变量:

$my_initializer = Rails::Initializer.run do |config|
  ...
end

然后我在我的一个控制器中放了debugger行,所以我可以这样做:

(rdb:2) $my_initializer.configuration.cache_classes
false

这样就消除了cache_classes的值在其他地方设置为true的可能性。我尝试过使用Mongrel和WEBrick,但它仍然会发生。

还有什么可能导致Rails不能在每次请求时重新加载我的代码?

我正在跑步: Mongrel 1.1.5
WEBrick 1.3.1
Rails 2.3.8
Ruby 1.8.7 p253

编辑: 在@Daemin的建议下,当我将它们保存在我的文本编辑器(Textmate)中时,我检查了我的文件的mtime实际上是否正在更新

merced:controllers lance$ ls -l people_controller.rb 
-rwxr-xr-x  1 lance  staff  2153 Act 10 18:01 people_controller.rb

然后我做了一个更改并保存了文件:

merced:controllers lance$ ls -l people_controller.rb 
-rwxr-xr-x@ 1 lance  staff  2163 Oct 11 12:03 people_controller.rb

所以这对mtimes来说不是问题。

5 个答案:

答案 0 :(得分:11)

事实证明config.threadsafe!会覆盖config.cache_classes = false的效果,即使它实际上并没有覆盖cache_classes(请参阅我的问题)证明)。在Rails源代码中挖掘更多内容可能会说明为什么会这样,但我实际上并不需要在我的开发环境中使用线程安全行为。相反,我将对环境.rb中的config.threadsafe!的调用替换为

config.threadsafe! unless RAILS_ENV == "development"

现在一切正常。

答案 1 :(得分:7)

如果其他人遇到此问题,则解决方法是订单:config.threadsafe!必须在config.cache_classes之前。像这样重新排序以修复它:

...
config.threadsafe!
config.cache_classes = false
...

回答:Rails: cache_classes => false still caches

答案 2 :(得分:5)

我怀疑您希望刷新的类在您的配置中某处“必需”。请注意,Rails的依赖性加载发生在Ruby的require发生之后。如果已经需要特定的模块或类,则Rails的依赖加载器不会处理它,因此不会重新加载。有关详细说明,请查看此文章:http://spacevatican.org/2008/9/28/required-or-not

答案 3 :(得分:2)

尽管线程安全!解决方案有效,我也想指出你的利益和其他可能在以下之后出现......

如果您正在编辑直接位于vendor / engines目录中的引擎代码,则不会在不重新启动的情况下更新这些文件。可能有一个配置选项来启用此类功能。但是,如果您使用引擎将大量功能与应用程序分开,则需要记住这一点非常重要。

答案 4 :(得分:0)

我的猜测是,它不会为每个请求重新加载类,因为它们在请求之间没有更改。因此,系统会记下加载类的最后修改时间,并且在更改之前不会重新加载它们。