É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.
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
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
Nevermind! Cela fonctionne parfaitement, idiot m'a placé un 'puts' envoyé chargé "'à la mauvaise position;). Merci – reto