Rails 3.1不重新加载更改过的视图



我在我的Ruby 1.9.2应用程序中发现了一个bug/特性。对视图(不是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 revision 30909) [x86_64-linux]Server: thin 1.2.11(也在Sinatra/Webrick上测试过)

EDIT 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指出这一点

未解决的问题:为什么Rails 3.1在Ruby 1.9.2上不重新加载视图?我能够得到ruby文件加载,但不是haml和erb文件。我最终重新启动服务器,只是为了看看一个错误是否被实际修复(或没有修复),因为文件没有正确加载。

编辑/解决方案(复制自我在接受的回答中的评论):

问题出在config/environments/development.rb

config.cache_classes = false

即使我们检查了这是正确的,我们仍然有问题。在文件的下面我们有:

config.threadsafe!

将以下3个标志设置为true: config.allow_concurrency, config.preload_frameworks和(惊喜!)config.cache_classes .

修复:将config.threadsafe!移动到config.cache_classes之上,这样它就不会被隐式覆盖。

Rails通常配置为在开发环境中自动重新加载每个请求。但是,lib/中的文件不会发生这种情况。

你描述的Sinatra的体验是有意的(自动重新加载在0.9.2中被删除):http://www.sinatrarb.com/faq.html#reloading;可以安装Shotgun gem来执行这个重新加载。

相关内容

  • 没有找到相关文章

最新更新