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,特别是在配置方面.
我通过在类中加载数据暂时避免了这个问题.让我远离这种丑陋,非模块化的肮脏.
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
部分。