在开发模式下重新加载隐式依赖项

时间:2011-07-03 10:41:29

标签: ruby-on-rails ruby

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

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

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

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

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

那我怎么能:

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

2 个答案:

答案 0 :(得分:1)

我相信有两种选择:

  1. 请不要将课程重新加载到Dependencies.load_once_paths(或将您的路径添加到load_once_paths,但不应该app/models)。您需要重新启动服务器以在开发模式下更新DSL。

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

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

答案 1 :(得分:0)

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

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

如果你想让rails不重新加载你的类,只需覆盖reloadable?类方法:

def self.reloadable?
  false
end