Я думаю, вы должны быть в состоянии сделать это с 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
Затем удалите код 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
часть.