【问题标题】:Can I change config.cache_classes programatically in Rails 3?我可以在 Rails 3 中以编程方式更改 config.cache_classes 吗?
【发布时间】:2011-10-22 00:05:31
【问题描述】:

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

我希望测试套件在开始时执行一个操作以打开类缓存,并在最后执行另一个操作以再次关闭类缓存。

这甚至可能吗?如果有,怎么做?

【问题讨论】:

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


    【解决方案1】:

    并非没有一些严重的黑客攻击。 Rails 在确保每次请求时都重新加载文件时遇到了很多麻烦(当cache_classes=false 时)。 cache_classes 配置变量的值被初始化器在多个地方使用,其中最重要的是:

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

    您确实可以访问cache_classes 变量的值,您甚至可以根据需要更改它:

    Rails.configuration.cache_classes = true
    

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

    这意味着,除非您准备投入大量时间和黑客攻击,否则您无法真正避免重新启动服务器。所以,你需要看的是通过你的测试套件控制这个重启过程。

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

    仍然需要一些工作来设置所有这些并将其挂在一起,但如果你想要一个“自动魔法”解决方案,这可能是你最好的选择。

    【讨论】:

      【解决方案2】:

      我认为按照你的建议做是行不通的。

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

      如果您想要从您的 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

      你应该有一个服务器,几乎和你的开发服务器一样, 但在不同的端口上运行,并启用了缓存。

      【讨论】:

      • 让两台服务器并行运行并不是一个坏主意,但它并不能完全解决问题。每当我进行更改时,我仍然需要重新启动这个新的测试服务器。
      • 我猜你可能需要决定faster requests with annoying restartsslower requests that auto-load changes
      • 是的,这就是当前的情况。我只是希望能够在特定时间段内开启“快速模式”。
      猜你喜欢
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2017-08-24
      • 2012-01-13
      相关资源
      最近更新 更多