2011-07-29 24 views
6

almaceno un valor en una variable de clase dentro de un módulo, tales como:módulo se vuelve a cargar cada petición se pierden datos, de modo inicializados

module TranslationEnhancer 
    def self.install! klass 
    @dictionaries ||= [] << klass 
    end 
    ... 
end 

llamo esto desde un inicializador en config/inicializadores:

require Rails.root + "lib" + "translation_enhancer.rb" 
TranslationEnhancer::install! TranslationDictionary 

Ahora, si inicio el servidor en el entorno de desarrollo, todo está bien durante la primera solicitud. Sin embargo, después de esa solicitud, @dictionaries es repentinamente nulo. He comentado todos los demás códigos en TranslationEnhancer, así que estoy absolutamente seguro de que todo el módulo debe volver a cargarse cada vez que hago una solicitud.

Traté de mover el módulo fuera del directorio lib (movido a lib_unloadable), entonces intenté:

ActiveSupport::Dependencies.explicitly_unloadable_constants << "TranslationEnhancer" 

pero volvió a fallar. No tengo idea de cómo resolver esto, por favor ayuda.

Got Ruby 1.9.2 @ Rails 3.1.rc4.

EDIT: Sé que podría establecer los diccionarios como una constante. Pero me gustaría utilizar TranslationEnhancer como una biblioteca - por lo que podía usar sin cambios en un proyecto diferente e instalar diferentes directorios, tales como:

TranslationEnhancer.install! EnglishDirectory, FrenchDirectory 

Estos valores won'd cambian durante el tiempo de ejecución, que se acaba de cambiar proyecto para proyectar.

+2

Bueno, es una característica, no un error :-) No pude resistir, lo siento por eso. – mliebelt

+0

¿Por qué no define una constante dentro de un inicializador de esa manera usted podría acceder a él por su nombre en todas las aplicaciones? ¿Necesita cambiar el valor durante el tiempo de vida de la aplicación? –

+0

puede definir una constante como un hash y cambiar su valor de contenido cuando lo necesite (aún buscando una mejor solución) – apneadiving

Respuesta

5

Resuelto!

Me di cuenta de que todos los archivos application.rb y environment.rb se vuelven a cargar junto con todos los demás archivos. Lo único que no se vuelve a cargar son los inicializadores (config/initializers/*). La solución fue mover la inicialización a application.rb.

0

@dictionaries no es una "variable de clase". Es una "variable de instancia de nivel de clase". Busque aquí una mejor explicación: Class and instance variables

Pruebe usar @@ dictionaries en su lugar.

+0

Artículo interesante, gracias por aclararme. Lamentablemente, no está relacionado con el problema. Todo se recarga en cada solicitud, incluidas las variables de instancia de nivel de clase y las variables de clase :( –

+0

Ah, eso es extraño. Sé que Rails tiene recarga de modelos para facilitar el cambio de código más fácil/dinámico sobre la marcha (sin requerir un reinicio del servidor). una opción environment/config que lo habilita. Tal vez puedas probar esto en desarrollo al desactivarlo. Significará que debes reiniciar cada vez que hagas un cambio de código ...pero eso puede ser aceptable para ti. –

+0

"config.cache_classes = false" no estoy seguro si esto ayudará, pero ¿valdría la pena intentarlo? –

Cuestiones relacionadas