我在我的 Ruby 1.9.2 应用程序中看到了一个错误/功能。对视图(不是 ruby 文件)的任何更改都需要重新启动服务器。我最初在 Rails 应用程序中遇到了这个问题,但我也在一个最小的 Sinatra 应用程序中测试了同样的事情。
我将包含一个简单的应用程序来演示
# testapp.rb
require 'sinatra'
get '/' do
[0,1,2].to_s #change this to [0,1].to_s
end
这是我的程序:
ruby testapp.rb
(为我运行瘦服务器)- 加载页面
- 打开文件并编辑视图
- 重新加载页面(我没有看到任何变化)
- 杀死服务器
- 重新启动服务器(更改现在可见)
在过去的几个月里,我一直在使用 Rails 3 上的 Ruby 1.8.7 进行开发。在任何视图更改时必须重新启动服务器会严重减慢开发速度。
我已经准备好了这个 SO 线程,但是在我的 Rails 版本(3.1.0 rc4)中,配置变量已经根据该答案设置。此外,我可以使用 Sinatra 复制错误,因此情况似乎并非如此。
任何人都可以阐明这个问题吗?
Ruby 版本:ruby 1.9.2p180(2011-02-18 修订版 30909)[x86_64-linux] 服务器:thin 1.2.11(也使用 Sinatra/Webrick 进行了测试)
编辑 7/13,澄清 Sinatra 是一个单独的问题——默认情况下禁用 Sinatra 的源重新加载。我使用此代码来测试行为:
require 'sinatra'
require 'sinatra/reloader'
require 'haml'
set :views, 'views'
get '/' do
end
get '/test' do
haml :test
end
有了这个,我做了一个文件:views/test.haml
. 在服务器运行时修改它确实会在重新加载页面时显示更改。感谢Tiredpixel 指出这一点
未解决的问题:为什么 Ruby 1.9.2 上的 Rails 3.1 不重新加载视图?我能够加载 ruby 文件,但不能加载 haml 和 erb 文件。我最终重新启动服务器只是为了查看是否由于文件未正确加载而实际修复(或未修复)错误。
编辑/解决方案(从我在已接受答案中的评论中复制):
问题出在config/environments/development.rb
config.cache_classes = false
即使我们检查了这是正确的,我们仍然遇到了问题。在我们拥有的文件的更下方:
config.threadsafe!
这样做是将以下 3 个标志设置为 true:config.allow_concurrency
、config.preload_frameworks
和 (surprise!) config.cache_classes
。
修复:移到config.threadsafe!
上面config.cache_classes
,这样它就不会被隐式覆盖。