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

Eri*_* Hu 7 ruby-on-rails sinatra ruby-1.9.2

我在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
Run Code Online (Sandbox Code Playgroud)

这是我的程序:

  • 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]服务器:瘦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
Run Code Online (Sandbox Code Playgroud)

有了这个,我做了一个文件:views/test.haml.在服务器运行时修改它确实在重新加载页面时显示更改.感谢Tiredpixel指出这一点

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

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

问题在于 config/environments/development.rb

config.cache_classes = false
Run Code Online (Sandbox Code Playgroud)

即使我们检查了这是正确的,我们仍然有问题.我们在文件中进一步向下:

config.threadsafe!
Run Code Online (Sandbox Code Playgroud)

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

要解决:移动config.threadsafe!上面config.cache_classes,所以它不会隐式覆盖.

tir*_*xel 7

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

您使用Sinatra描述的经验(在0.9.2中删除了自动重新加载):http://www.sinatrarb.com/faq.html#reloading ; 该猎枪宝石可以安装执行此重装.

  • 你检查过`config/environments/development.rb``config.cache_classes = false`和`config.action_controller.perform_caching = false`吗? (3认同)
  • 所以这是正确的道路.我团队中有人得到了它.我们已经有了'config.cache_classes = false`(以及你提到的另一个标志).但是,在文件中我们进一步说:`config.threadsafe!`.这样做是将以下3个标志设置为true:`config.allow_concurrency`,`config.preload_frameworks`,`config.cache_classes`.然后,修复是将`config.threadsafe!`移到`config.cache_classes`之上,这样它就不会被隐式覆盖. (2认同)