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

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

  config.cache_classes = false 

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

  $ my_initializer = Rails :: Initializer.run do | config |
   ...
结束 

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

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

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

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

我正在运行:Mongrel 1.1.5
WEBrick 1.3.1
Rails 2.3.8
Ruby 1.8.7 p253

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

  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的问题。

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

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

回答来自: Rails:cache_classes => false仍然缓存

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

  config.threadsafe! 除非RAILS_ENV ==“开发” 

现在一切正常。

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

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

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

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