2009-12-14 5 views
2

Dans Rails, dans un initializer/environment.rb Whats la manière peemed de détecter si la webapp elle-même est en cours de chargement (script/serveur).Déterminez si le script/serveur est démarré

Tous les initialiseurs sont chargés pour les migrations script/console et d'autres tâches de tâches, mais dans mon cas, certains éléments doivent uniquement être chargés lors de l'initialisation du serveur lui-même.

Mes idées: vérifier 0

$ Merci! Reto

Répondre

3

Étant donné qu'il existe plusieurs serveurs d'applications, chacun avec sa propre stratégie d'initialisation, je recommande la seule façon de connecter de manière fiable le processus de démarrage du serveur: ActionController :: Dispatcher.

Le répartiteur dispose de certains rappels; à savoir:

  • prepare_dispatch (ajouté avec to_prepare)
  • before_dispatch
  • after_dispatch

callbacks "préparer" sont exécutés avant chaque demande en mode développement, et avant la première demande en mode de production . L'objet de configuration Rails vous permet d'ajouter ces callback via sa propre méthode to_prepare:

Rails::Initializer.run do |config| 
    config.to_prepare do 
    # do your special initialization stuff 
    end 
end 

Malheureusement, à ma connaissance ce rappel sera toujours exécuté depuis Rails appelle initialiseur Dispatcher.run_prepare_callbacks peu importe si nous démarrer avec un serveur ou à un script/console ou même une tâche de rake. Vous voulez éviter cela, vous pouvez essayer dans votre environment.rb:

Rails::Initializer.run do |config| 
    # your normal stuff 
end 

if defined? ActionController::Dispatcher 
    ActionController::Dispatcher.to_prepare do 
    # your special stuff 
    end 
end 

Maintenant, vos « trucs spéciaux » n'exécutera avant la première demande en mode de production, mais avant chaque demande dans le développement. Si vous chargez des bibliothèques supplémentaires, vous pouvez éviter de charger quelque chose deux fois en mettant une instruction if autour de load ou require. La méthode require ne chargera pas un seul fichier deux fois, mais je vous recommande quand même de mettre un garde autour d'elle.

+0

Merci! Vérification pour le répartiteur semble être une très bonne idée! Mais je ne vais pas utiliser 'to_prepare' car je n'ai besoin de faire qu'une seule fois (au démarrage). Mais le concept reste le même! Super. – reto

+0

ah je vois, non, ActionController :: Dispatcher est défini dans tous les cas. Cela pourrait être causé par le fait que j'utilise jruby. Dunno. Je pense que je vais retomber à 0 $ pour le moment. Merci quand même! – reto

+0

Nevermind! Cela fonctionne parfaitement, idiot m'a placé un 'puts' envoyé chargé "'à la mauvaise position;). Merci – reto

0

Il y a probablement une meilleure façon de le faire, mais comme je ne suis pas au courant d'un, je modifierais probablement script/serveur pour définir une variable d'environnement quelconque.

Puis j'aurais mon contrôle d'initialisateur pour cette variable d'environnement.