14

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

config.cache_classes = false

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

$my_initializer = Rails::Initializer.run 做 |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 的建议下,当我将文件保存在我的文本编辑器(Textmate)中时,我检查了文件的 mtime 实际上正在更新

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

然后我进行了更改并保存了文件:

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

所以这不是mtimes的问题。

4

5 回答 5

11

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

config.threadsafe!除非 RAILS_ENV == "发展"

现在一切正常。

于 2011-10-20T19:32:19.007 回答
7

如果其他人有这个问题,解决方案是 order: config.threadsafe!has to come before config.cache_classes。像这样重新排序以修复它:

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

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

于 2014-08-28T18:45:53.253 回答
5

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

于 2011-10-20T06:40:24.250 回答
2

尽管线程安全!解决方案有效,我还想指出您的利益以及以下可能出现的其他问题......

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

于 2011-10-25T18:30:50.520 回答
0

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

于 2011-10-11T00:48:07.970 回答