我最近每次更改代码时都要重新启动开发服务器。我的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来说不是问题。
答案 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
...
答案 2 :(得分:5)
我怀疑您希望刷新的类在您的配置中某处“必需”。请注意,Rails的依赖性加载发生在Ruby的require
发生之后。如果已经需要特定的模块或类,则Rails的依赖加载器不会处理它,因此不会重新加载。有关详细说明,请查看此文章:http://spacevatican.org/2008/9/28/required-or-not
答案 3 :(得分:2)
尽管线程安全!解决方案有效,我也想指出你的利益和其他可能在以下之后出现......
如果您正在编辑直接位于vendor / engines目录中的引擎代码,则不会在不重新启动的情况下更新这些文件。可能有一个配置选项来启用此类功能。但是,如果您使用引擎将大量功能与应用程序分开,则需要记住这一点非常重要。
答案 4 :(得分:0)
我的猜测是,它不会为每个请求重新加载类,因为它们在请求之间没有更改。因此,系统会记下加载类的最后修改时间,并且在更改之前不会重新加载它们。