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

cor*_*ard 6 ruby ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

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

我通过在类中加载数据暂时避免了这个问题.让我远离这种丑陋,非模块化的肮脏.

sco*_*twb 1

config.to_prepare我认为,如果您将调用Template.add移出template_name.rb文件(我假设这就是它们现在所在的位置)并移入加载代码(就在require. 例如,考虑将此类方法添加到您的 Template 类中,然后甚至可以在首次加载时从类本身调用它:

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
Run Code Online (Sandbox Code Playgroud)

然后Template.add(name)template_name.rb他们自己注册的文件中删除代码。(再次,我假设这就是当前发生的情况 - 我在您的原始帖子中对此不太清楚。)或者也许您只是想确保Template.add幂等并默默地丢弃重复项。

最后,将以下内容添加到config/environments/development.rb

config.to_prepare do
  Template.load_all
end
Run Code Online (Sandbox Code Playgroud)

这将在类重新加载后重新加载所有模板Template

Template.load_all我还没有尝试过这个,但是通过我在课程结束时建议的电话Template,您可能甚至不需要该config.to_prepare部分。