在开发模式下重新加载Rails 3初始化程序

时间:2011-02-07 18:21:39

标签: ruby-on-rails ruby ruby-on-rails-3

我正在构建一个Rails 3应用程序,用户可以从中选择一个模板并构建一个小网站。我正在尝试在应用程序启动时初始化所有可用模板。这本质上是一个文件,让我自己定义它们,然后为每个文件调用Template.add(template),然后将它们存储在@@templates中,我可以通过Template.find(name)访问它们。

问题是在开发模式下,我调用Template.add的初始化程序在第一个请求上加载,然后在reload!上消失。我读过关于config.to_prepare的内容,但它对我不起作用,可能是因为我需要这样的模板:

# template config at app/templates/template_name/template_name.rb
path = File.expand_path(Rails.root + 'app/templates')
Dir[File.join(path, '/*')].each do |template|
  name = File.basename(template)
  require File.join(path, name, "#{name}.rb")
end

我可以做些什么来在reload!之后重新加载这些文件或者让它们完全没有被删除?此外,如果你有一个更好的方法来处理这个问题的建议,我会全力以赴。我仍然在使用Rails,特别是在配置方面。

我通过在类中加载数据暂时避免了这个问题。救我脱离这种丑陋,非模块化的肮脏行为。

2 个答案:

答案 0 :(得分:1)

如何将模板名称的查找存储到memcached或Redis等内存存储中的文件中,甚至存储在数据库中。初始化程序可以加载内存存储库或确保数据库是最新的所有值,然后Template.find可以只查看商店以查看文件的位置,甚至只是获取类名称他们已经装好了。只需查看是否定义了类名,就可以告诉您是否需要模板文件,或者只是继续创建新实例。

基本上将@@templates存储在rails进程内存之外,或至少提供足够的信息,以便您可以构建动态需要的@@templates部分。

答案 1 :(得分:1)

如果您将config.to_prepare文件中的Template.add移至template_name.rb,我认为您应该可以使用require执行此操作(我认为这是他们现在所处的位置) ,以及class Template def self.load_all # template config at app/templates/template_name/template_name.rb path = File.expand_path(Rails.root + 'app/templates') Dir[File.join(path, '/*')].each do |template| name = File.basename(template) require File.join(path, name, "#{name}.rb") # Register the template even if the class itself is already loaded. Template.add(name) end end # Initially load all templates. Template.load_all end 之后的加载代码。例如,考虑将此类方法添加到Template类中,然后甚至可能在第一次加载时从类本身调用它:

Template.add(name)

然后从他们注册的template_name.rb个文件中删除Template.add代码。 (同样,我假设这是目前发生的地方 - 我在原帖中对此不太清楚。)或者你可能只是想确保config/environments/development.rb是幂等的并且默默地丢弃重复项。

最后,将以下内容添加到config.to_prepare do Template.load_all end

Template

这将在Template.load_all课程重新加载后重新加载所有模板。

我没有试过这个,但是在Template课程结束时我建议调用config.to_prepare,你可能甚至不需要{{1}}部分。