我正在开发一个带有嵌入式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数组。
那我怎么能:
答案 0 :(得分:1)
我相信有两种选择:
请不要将课程重新加载到Dependencies.load_once_paths
(或将您的路径添加到load_once_paths
,但不应该app/models
)。您需要重新启动服务器以在开发模式下更新DSL。
在课程声明之后的repository.rb
底部添加初始化(类似load "your_dsl_path_name"
)。
我对config/environment.rb
的第一个想法不起作用。
答案 1 :(得分:0)
按照设计,在Rails中,每个请求都应该被认为是独立的,并且不应该使用类变量来保留任何内容。即使您在开发中禁用重新加载,也无法保证即使在生产过程中也会保持进程。许多部署(如Heroku)使用分布式流程模型,因此您的@items
类变量在请求之间不一致。
我强烈建议您将数据保存在其他位置,例如数据库或Memcached等持久键值存储。
如果你想让rails不重新加载你的类,只需覆盖reloadable?
类方法:
def self.reloadable?
false
end