Ruby on rails 在开发模式中重新加载隐式依赖项

Ruby on rails 在开发模式中重新加载隐式依赖项,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在开发一个带有嵌入式DSL的Rails应用程序,用于定义可定制但长期存在的数据结构。为此,我在/app下创建了一个目录,一些技术含量较低的团队成员可以在其中编辑类似以下内容的数据结构: Repository.define do item :important do cost 30 depends_on :even_more_important # further config end end 使用初始值设定项加载这些文件,该初始值设定项在存储库类中保存并创建

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

Repository.define do
  item :important do
    cost 30
    depends_on :even_more_important
    # further config
  end
end
使用初始值设定项加载这些文件,该初始值设定项在存储库类中保存并创建数据结构:

class Repository
  def self.item(name, &block)
    @items[name] = Item.new(name, &block)
  end
end
在开发模式下,每次请求时都会重新加载Repository类,每次都会清除items数组

那么,我怎样才能:

  • 防止重新加载存储库类
  • 或者最好在重新加载Repository类之后重新加载items目录中的文件

  • 我相信有两个选择:

  • 不要通过将类移动到
    依赖项来重新加载类。加载一次路径
    (或者将您的路径添加到
    加载一次路径
    ,但它不应该是
    应用程序/模型
    )。您需要重新启动服务器以在开发模式下更新DSL

  • 在类声明之后将初始化添加到
    repository.rb
    的底部(类似于
    加载“您的\u dsl\u路径\u名称”


  • 我对
    config/environment.rb的第一个想法没有奏效。

    我认为有两个选择:

  • 不要通过将类移动到
    依赖项来重新加载类。加载一次路径
    (或者将您的路径添加到
    加载一次路径
    ,但它不应该是
    应用程序/模型
    )。您需要重新启动服务器以在开发模式下更新DSL

  • 在类声明之后将初始化添加到
    repository.rb
    的底部(类似于
    加载“您的\u dsl\u路径\u名称”


  • 我对
    config/environment.rb的第一个想法不起作用。

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

    我强烈建议您将该数据持久化到其他地方,如数据库或持久化键值存储(如Memcached)

    不过,如果您不想让rails重新加载类,只需重写
    reloadable?
    class方法:

    def self.reloadable?
      false
    end
    

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

    我强烈建议您将该数据持久化到其他地方,如数据库或持久化键值存储(如Memcached)

    不过,如果您不想让rails重新加载类,只需重写
    reloadable?
    class方法:

    def self.reloadable?
      false
    end
    

    配置选项呢?它们是从源代码树、一致的accross请求和IMO中读取的,这是@derfred想要的(它们存储在类变量中)。这些不会在请求之间更改,因此即使服务器重新启动,重新加载的选项也是相同的。数据结构是静态的。在生产中,它们不会改变,但我希望开发团队拥有与模板相同的功能,您可以在开发模式下编辑模板,而无需重新启动服务器。配置选项如何?它们是从源代码树、一致的accross请求和IMO中读取的,这是@derfred想要的(它们存储在类变量中)。这些不会在请求之间更改,因此即使服务器重新启动,重新加载的选项也是相同的。数据结构是静态的。在生产中,它们不会改变,但我希望开发团队拥有与模板相同的功能,您可以在开发模式下编辑这些模板,而无需重新启动服务器。