2011-02-07 15 views
6

Estoy construyendo una aplicación de Rails 3 donde los usuarios pueden seleccionar una de varias plantillas y crear un sitio web pequeño. Intento inicializar todas las plantillas disponibles cuando se inicia la aplicación. Eso es esencialmente un archivo que me permite definirlos todos, luego llama a Template.add(template) para cada uno de ellos, que a su vez los almacena en @@templates y puedo acceder a ellos a través del Template.find(name).Inicializador Reload Rails 3 en modo de desarrollo

El problema es que en el modo de desarrollo, el inicializador que tengo realizando las llamadas a Template.add se cargan en la primera solicitud y luego se borran en reload!. He leído sobre config.to_prepare, pero no está funcionando para mí, probablemente porque estoy requiriendo las plantillas de este tipo:

# 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 

¿Qué puedo hacer para recargar o bien estos archivos después de reload! o evitar que se destrozado en absoluto? Además, si tienes una recomendación para una mejor manera de manejar esto, soy todo oídos. Todavía estoy obteniendo mi equilibrio con Rails, especialmente en lo que respecta a la configuración.

Estoy evitando temporalmente este problema al cargar los datos en la clase. Sálvame de esta fea y no modular maldad.

+0

No estoy seguro de que recibí su pregunta. Entonces solo una sugerencia: ¿por qué no cargan automáticamente sus archivos? http: // hemju.com/2010/09/22/rails-3-quicktip-autoload-lib-directory-including-all-subdirectories/ – apneadiving

+0

La falta de familiaridad con el proceso, en realidad, pero de todos modos no resuelve mi problema. El modelo de Plantilla se vuelve a cargar en cada solicitud (cache_classes = false en desarrollo) y mis archivos de plantilla no se volverán a cargar, por lo que en la segunda solicitud no hay ninguna plantilla "registrada" con el modelo de Plantilla. – coreyward

+0

¿Puedes explicar un poco más acerca de por qué crees que esto no funciona con to_prepare? – johnmcaliley

Respuesta

1

creo que debería ser capaz de hacer esto con config.to_prepare si mueve sus llamadas a Template.add de los archivos template_name.rb (soy suponer que es donde están ahora), y en el código de carga, justo después de la require . Por ejemplo, considere la adición de este método de clase de la clase de plantilla y, a continuación, tal vez incluso llamándolo desde la propia clase cuando por primera vez se carga:

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 

A continuación, eliminar el código Template.add(name) de los template_name.rb archivos donde están registrándose . (De nuevo, estoy asumiendo que esto es donde sucede actualmente, no estoy del todo claro con respecto a la publicación original). O tal vez solo quiera asegurarse de que Template.add sea idempotente y silenciosamente descarte los duplicados.

Por último, añada lo siguiente a config/environments/development.rb:

config.to_prepare do 
    Template.load_all 
end 

que se recargue todos sus plantillas después vuelve a cargar la clase Template.

No he intentado esto, pero con la llamada al Template.load_all que sugerí al final de la clase Template, puede que ni siquiera necesite la pieza config.to_prepare.

+0

No sabía nada de 'config.to_prepare' cuando tuve este problema y no lo he pensado bien desde que publiqué esto, pero creo * que me funcionará bastante bien. Lo intentaré cuando tenga tiempo y acepto si es así. – coreyward

1

¿Qué hay de guardar la búsqueda de nombres de plantilla en sus archivos en un almacén de memoria como memcached o Redis, o incluso en la base de datos. El inicializador podría cargar el almacén de memoria o asegurarse de que la base de datos esté actualizada con todos los valores, y luego Template.find podría simplemente mirar a la tienda para ver dónde están los archivos, o incluso simplemente obtener el nombre de clase si ya están funcionando para ser cargado Simplemente ver si el nombre de la clase está definido puede indicarle si necesita solicitar el archivo de la plantilla o simplemente continuar y crear su nueva instancia.

Básicamente, almacene @@templates fuera de la memoria de proceso de los rieles, o al menos información suficiente para que pueda construir las partes de @@templates que necesite sobre la marcha.

+0

Hmm. Definitivamente no quiero introducir dependencias adicionales en la aplicación innecesariamente. I * estaba * usando ActiveRecord, pero no me gusta la idea de alterar la base de datos cuando se inicia la aplicación; Siento que podría haber un problema si dos dinnos (estoy en Heroku) se disparan al mismo tiempo. – coreyward

Cuestiones relacionadas