【问题标题】:Rails 3.1 Not Reloading Changed ViewsRails 3.1 不重新加载更改的视图
【发布时间】:2011-09-30 03:54:45
【问题描述】:

我在我的 Ruby 1.9.2 应用程序中发现了一个错误/功能。对 views(不是 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(为我运行瘦服务器)
  • 加载页面
  • 打开文件并编辑视图
  • 重新加载页面(我没有看到任何变化)
  • 杀死服务器
  • 重新启动服务器(更改现在可见)

在过去的几个月里,我一直在使用 Ruby 1.8.7 on Rails 3 进行开发。在任何视图更改时都必须重新启动服务器会严重减慢开发速度。

我已经准备好this SO thread,但是在我的 Rails 版本(3.1.0 rc4)中,config 变量已经根据该答案设置。此外,我可以使用 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_concurrencyconfig.preload_frameworks 和(惊喜!)config.cache_classes

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

【问题讨论】:

  • 我刚刚创建了一个全新的 3.1.0 rc4 应用和pushed it to github。它有一个带有单一方法和路由的控制器。我正在运行 1.9.2-p180。当我运行thin start,浏览http://localhost:3000/,更改app/views/pages/index.html.erb,视图重新加载正常。
  • 感谢推送。显然这是config.threadsafe! 写在config.cache_classes 上的问题

标签: ruby-on-rails sinatra ruby-1.9.2


【解决方案1】:

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

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

【讨论】:

  • 嗯,我想我的帖子指向了 2 个不同的问题,但我没有意识到。我会更新的
  • 你检查过config/environments/development.rbconfig.cache_classes = falseconfig.action_controller.perform_caching = false吗?
  • 所以这是正确的道路。我的团队中有人得到了它。我们已经有了config.cache_classes = false(以及你提到的另一个标志)。但是,在我们拥有的文件的更下方:config.threadsafe!。这样做是将以下 3 个标志设置为 true:config.allow_concurrencyconfig.preload_frameworksconfig.cache_classes。然后,解决方法是将config.threadsafe! 移到config.cache_classes 上方,这样它就不会被隐式覆盖。
  • 非常好 - 我不知道 config.threadsafe! 这样做了 - 感谢您的解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多