我可以在Rails 3中以编程方式更改config.cache_classes吗?

时间:2011-08-07 21:44:47

标签: ruby-on-rails ruby ruby-on-rails-3 caching ruby-on-rails-plugins

我有一些针对我的开发rails服务器运行的iPhone客户端测试。如果我在Rails配置中启用类缓存,整个套件的运行速度会快一个数量级。另一方面,当我没有实际运行测试时,这会减慢开发速度。

我希望测试套件在开始时点击一个动作来打开类缓存,最后再用另一个动作来再次关闭类缓存。

这甚至可能吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:1)

不是没有一些严重的黑客行为。 Rails会遇到很多麻烦,以确保每次请求都重新加载文件(cache_classes=false时)。 cache_classes配置变量的值由初始化程序在几个地方使用,其中最重要的是:

  • 当cache_classes为require时使用true加载ruby文件(意味着它们不再可重新加载)
  • 设置调度程序回调,以便在cache_classesfalse
  • 时为每个请求启用应用程序

您可以访问cache_classes变量的值,如果愿意,您甚至可以更改它:

Rails.configuration.cache_classes = true

但是,这对运行rails实例没有任何影响,因为初始化器使用该值只在rails应用程序启动时运行一次。

这意味着什么,除非你准备投入一些重要的时间和黑客努力,否则你无法真正避免重启你的服务器。因此,您需要了解的是通过测试套件控制此重启过程。

例如,您可以尝试重新启动rails from within rails。这将允许您定义测试套件在开始执行之前可以命中的操作(以正确模式重新启动服务器),以及服务器在所有测试完成后可以执行的另一个操作,以{{设置为以前的设置。您可以通过环境变量like this post suggests来控制缓存类的值。

仍然需要一些工作来设置所有这些并让它挂在一起,但如果你想要一个'自动神奇的'解决方案,这可能是你最好的选择。

答案 1 :(得分:0)

我不认为按照你的建议行事。

但我建议您可能正在寻找错误的解决方案。

如果你想要的是从你的iPhone测试中访问你的开发数据库, 那么为什么不添加一个新的环境。

添加新文件config / environments / iphone_dev.rb

require File.dirname(__FILE__)+"/development.rb"
config.cache_classes = true

在你的database.yml(或mongoid.yml或其他)中

iphone_dev:
  host: localhost
  database: my_app_development

没有理由数据库不能相同

现在只需运行rails server -eiphone_dev -p3001

您应该有一台服务器,几乎与您的开发服务器相同, 但是在不同的端口上运行,并启用了缓存。