【问题标题】:Reloading implicit dependencies in Development mode在开发模式下重新加载隐式依赖项
【发布时间】:2011-07-03 10:41:28
【问题描述】:

我正在开发一个带有嵌入式 DSL 的 Rails 应用程序,用于定义可定制但长期存在的数据结构。为此,我在 /app 下创建了一个目录,一些技术含量较低的团队成员可以在其中编辑类似于此的数据结构:

Repository.define do
  item :important do
    cost 30
    depends_on :even_more_important
    # further config
  end
end

这些文件是使用初始化程序加载的,该初始化程序保存在 Repository 类中创建数据结构:

class Repository
  def self.item(name, &block)
    @items[name] = Item.new(name, &block)
  end
end

在开发模式下,Repository 类在每次请求时都会重新加载,每次都会清除 items 数组。

那我该怎么办:

  1. 防止重新加载 Repository 类
  2. 或者在重新加载 Repository 类之后重新加载项目目录中的文件更好?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    我相信有两种选择:

    1. 不要通过将类移动到 Dependencies.load_once_paths 来重新加载类(或者将路径添加到 load_once_paths,但它不应该是 app/models)。您需要重新启动服务器才能在开发模式下更新 DSL。

    2. 在类声明后的repository.rb 底部添加您的初始化(类似于load "your_dsl_path_name")。

    我对@9​​87654326@ 的第一个想法没有奏效。

    【讨论】:

      【解决方案2】:

      按照设计,在 Rails 中,每个请求都应该被认为是独立的,并且您不应该使用类变量来持久化任何内容。即使您在开发中禁用重新加载,也不能保证即使在生产中进程也会持续存在。许多部署(如 Heroku)使用分布式进程模型,因此您的 @items 类变量在请求之间不会保持一致。

      我强烈建议您将这些数据持久保存在其他地方,例如数据库或 Memcached 等持久键值存储。

      如果你想阻止 Rails 重新加载你的类,只需覆盖 reloadable? 类方法:

      def self.reloadable?
        false
      end
      

      【讨论】:

      • 配置选项怎么样?它们是从源代码树中读取的,一致的跨请求和 IMO 这是@derfred 想要的(并且它们存储在类变量中)。
      • Rails 配置就是:配置。这些在请求之间不会改变,因此即使服务器重新启动,重新加载的选项也是相同的。
      • 数据结构是静态的。在生产中它们不会改变,但我希望开发团队具有与模板相同的功能,您可以在开发模式下编辑而无需重新启动服务器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 2021-12-29
      • 2011-08-02
      • 2012-02-05
      • 1970-01-01
      相关资源
      最近更新 更多