2010-03-10 6 views
4

J'ai un module dans mon application Rails qui vit dans/libarrêt Rails de déchargement d'un module en mode développement

module MyModule 
    mattr_accessor :the_variable 

    class << self 
    def setup 
     yield this 
    end 
    end 
end 

De mon fichier environments/#{RAILS_ENV}.rb je peux alors définir une valeur spécifique à l'environnement pour the_variable:

MyModule.setup do |my_module_config| 
    my_module_config.the_variable = 42 
end 

Ceci est charmant, et il semble fonctionner (presque) bien.

Le problème est que, en mode développement, Rails via ActiveSupport::Dependencies décharge une charge de modules et les recharge à temps pour la nouvelle demande. C'est généralement un bon comportement car cela signifie que vous n'avez pas besoin de redémarrer votre serveur localhost lorsque vous modifiez du code.

Toutefois, cela efface également ma variable the_variable initialisée, et lorsque la requête suivante arrive dans l'initialiseur (évidemment), elle n'est pas réexécutée. L'effet net est que les demandes suivantes finissent par avoir MyModule.the_variable mis à nil plutôt que le 42 que je cherche. J'essaye de trouver comment arrêter Rails déchargeant mon module à la fin de la demande, ou alternativement trouver une autre manière de fournir proprement la configuration spécifique d'environnement pour mes modules.

Des idées? : -/

Répondre

10

Dans votre fichier d'environnement avant de référencer MyModule, utilisez require pour charger le fichier.

require 'my_module' 

cela contourne le mécanisme de chargement de dépendance dynamique.

+0

Je suis sûr que j'ai déjà essayé, mais je l'ai encore essayé et ça semble fonctionner parfaitement maintenant – Gareth

Questions connexes