【问题标题】:Prevent Rails 2/3 from caching of Lib/ Classes防止 Rails 2/3 缓存 Lib/ 类
【发布时间】:2011-03-26 02:41:56
【问题描述】:

有谁知道如何指示 rails 不缓存 lib 文件夹中包含的类?

【问题讨论】:

    标签: ruby-on-rails ruby optimization caching class


    【解决方案1】:

    我认为“缓存类”是指在处理新请求之前,应用程序目录中的源文件会自动重新加载到开发环境中?

    这与缓存无关,Ruby 的正常行为是,只要进程运行,就读取和解析源文件一次,不再重复。 Rails(实际上是 ActiveSupport::Dependencies)提供了一种在处理请求之前重新加载整个代码的机制。在开发环境中,这很有用,因为您不想在每次更改代码时都重新启动本地网络服务器。在生产环境中,这会严重影响性能,因此被关闭。

    默认情况下,应用程序类被标记为可重新加载。您可以使用unloadable 类方法在开发环境中处理请求之前标记要重新加载的任意类:

    class MyClass
      unloadable # mark this class as reloadable before a request is processed
    
      # …
    end
    

    请注意,并非每个类都可以很好地卸载。只要您在一个由 Rails 的自动加载机制找到并加载的源文件中定义您的类,您可能就很好了。但是,如果您在其他地方重新打开您的课程以对其进行猴子补丁,可能会遇到麻烦,因为自动加载不会捕捉到这一点。

    【讨论】:

    • 不完全是。我的意思是当我将一个类(使用 require 和 include)加载到我的应用程序中时。然后,每当在另一个页面或另一个请求上使用该类时,rails 就不再需要该文件(加载文件),它只是使用之前加载的类(因为它保留在内存中)。这令人沮丧,因为每次对包含的 lib 类进行更改时,我都需要重新加载 rails 服务器。我在开发模式下运行它,配置缓存类设置为 false。
    • 我明白了。 Rails 重新加载机制可能仅在您的类被 Rails 的自动加载覆盖时才有效,而不是在您手动需要它的情况下。我建议让你的类通过 Rails 自动加载来加载,无论如何这非常方便(你不必要求它,它可以在任何地方工作)。如果这不可能,你可以尝试通过将你的类文件加载到自动加载覆盖的文件中来利用 Rails 的自动加载(但请确保使用#load,而不是#require,因为 require 只加载一次)
    【解决方案2】:

    这也可以通过不使用lib/ 目录来完成,而是通过在app/helpers 目录中存储任何类或帮助文件来完成。这样,它们将在开发期间重新加载并在生产期间缓存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      相关资源
      最近更新 更多