2011-07-03 50 views
1

我正在开发一个带有嵌入式DSL的Rails应用程序,用于定义可定制但长期存在的数据结构。为此,我创建在/应用程序的目录中一些不太技术团队成员可以编辑的类似于这样的数据结构:在开发模式下重新加载隐式依赖关系

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 

在开发模式中的存储库类被重新加载在每次请求,每次清除项目阵列。

所以,我怎么能:

  1. 防止repository类
  2. 甚至更​​好的重装重装的项目目录文件存储库类的重装后?

回答

1

我认为有两种选择:

  1. 不要将它移动到Dependencies.load_once_paths重装类(或您的路径添加到load_once_paths,它不应该是app/models虽然)。您将需要重新启动服务器以在开发模式下更新DSL。

  2. 将您的初始化添加到您的repository.rb课后声明的底部(如load "your_dsl_path_name")。

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

+0

第二个选项为我工作。 – derfred

0

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

我强烈建议您将数据保存在别处,例如数据库或像Memcached这样的持久性键值存储。

不过,如果你想保持轨道从重装类,只是重写reloadable?类方法:

def self.reloadable? 
    false 
end 
+0

配置选项如何?它们从源码树中读取,一致的跨请求和IMO这是@derfred想要的(并且它们存储在类变量中)。 –

+0

Rails配置就是这样的:配置。那些请求之间不会改变,即使服务器重新启动,重新加载的选项也是一样的。 – edgerunner

+0

数据结构是静态的。在生产中他们不会改变,但我希望开发团队具有与您可以在开发模式下编辑而无需重新启动服务器的模板相同的功能。 – derfred