Où mettez-vous votre middleware Rack fichiers et exige?
Je suis dans le processus de refactoring d'un peu de logique intégré dans une application Rails de middleware et d'un ennui que j'ai, est un manque apparent de la convention pour savoir où les mettre.
Actuellement, j'ai installé sur app/middleware
mais je pourrais tout aussi facilement le déplacer vers vendor/middleware
ou peut-être vendor/plugins/middleware
...
Le plus gros problème est d'avoir à demander à la personne de fichiers en haut de config/environment.rb
require "app/middleware/system_message"
require "app/middleware/rack_backstage"
sinon je obtenir uninitialized constant erreurs sur le config.middleware.use
lignes. Qui pourrait dégénérer très rapidement. Je préfère cela a été caché loin dans un initialiseur quelque part.
Est-il un classique de la place pour mettre ce genre de choses?
Spécifiques de la réponse, je suis à la recherche de cette prime est de: où puis-je mettre l'exigent les lignes de sorte qu'ils ne sont pas encombrer l'environnement.rb fichier mais toujours chargées avant de la config.middleware.utilisation des appels? Tout ce que j'ai essayé conduit à uninitialized constant erreurs.
Mise à jour: Maintenant que nous sommes à l'aide de Rails 3.0, je traite une application Rails, comme toute autre application Rack; code des fichiers de middleware aller dans lib
(ou un bijou répertoriés dans Gemfile
) et sont nécessaires et chargé dans config.ru
.
Vous devez vous connecter pour publier un commentaire.
Comme des Rails 3.2, middleware Rack appartient dans le dossier app/middleware répertoire.
Il fonctionne "out-of-the-box", sans aucune explicite exiger des déclarations.
Exemple rapide:
Je suis à l'aide d'un middleware classe appelée CanonicalHost qui est mis en œuvre dans app/middleware/canonical_host.rb. J'ai ajouté la ligne suivante à la production.rb (note que le middleware de la classe est explicitement donnée, plutôt que comme une chaîne de caractères entre guillemets, ce qui fonctionne pour n'importe quel environnement spécifique des fichiers de configuration):
Si vous êtes l'ajout d'un middleware pour application.rb, vous aurez besoin d'inclure les guillemets, comme par @mltsy commentaire.
production.rb
) - si vous voulez l'ajouter à tous les environnements en le mettant dansapplication.rb
, vous devez utiliser des guillemets (ou exiger explicitement le fichier qui définit votre classe), en raison de l'application.rb est l'une des premières choses qui est chargé avant tout de la dynamique de code d'initialisation des charges de laapp/middleware
fichiers.Vous pouvez le mettre dans
lib/tableized/file_name.rb
. Tant que la classe que vous essayez de charge est identifiable par son nom de fichier, Rails de charger automatiquement le fichier nécessaire. Ainsi, par exemple:Vous souhaitez garder dans:
Rails captures const_missing et tente de charger les fichiers correspondant aux disparus de constantes automatiquement. Assurez-vous simplement vos noms et vous êtes à la sauce. Rails fournit même chouette les aides qui vont vous aider à identifier le chemin d'accès d'un fichier facilement:
Donc mon stdlib vit dans
lib/chris_heald/std_lib.rb
, et est chargé lorsque je de référence dans le code.Rack::Backstage
. Mettre danslib/rack/backstage.rb
. Unititialized erreur constante.Dans mon Rails 3.2 application, j'ai pu obtenir mon middleware
TrafficCop
de chargement en le mettant àapp/middleware/traffic_cop.rb
, tout comme @MikeJarema décrit. Ensuite, j'ai ajouté cette ligne à monconfig/application.rb
, comme indiqué:Cependant, lors du démarrage de l'application, j'ai continué à obtenir cette erreur:
De spécifier explicitement l'espace de noms racine n'a pas aidé non plus:
Pour une raison quelconque (que j'ai encore à découvrir), à ce point dans les Rails du cycle de vie,
app/middleware
n'était pas inclus dans les chemins de chargement. Si j'ai enlevé leconfig.middleware.use
ligne, et a couru la console, j'ai pu accéder à laTrafficCop
constante sans aucun problème. Mais il ne pouvait pas le trouver dansapp/middleware
au temps de configuration.J'ai fixé ce, en joignant le middleware de la classe de nom entre guillemets, comme ceci:
De cette façon, je voudrais éviter les
uninitialized constant
erreur, puisque les Rails n'est pas en essayant de trouver laTrafficCop
classe pour l'instant. Mais, quand il commence à construire la pile de middleware, il constantize la chaîne. En ce moment,app/middleware
est dans les chemins de chargement, et donc la classe va se charger correctement.Pour Rails 3:
Je ne suis pas au courant d'une convention, mais pourquoi ne pas le mettre dans le
/lib
répertoire? Les fichiers là obtenir automatiquement chargé par les Rails.Vous pouvez créer un initialiseur qui exige que les fichiers nécessaires, puis de laisser les fichiers où vous voulez.
Selon cette les initialiseurs sont exécutés avant le middleware rack est chargé.
La solution de travail, j'ai à ce jour est de déplacer le middleware nécessite de
config/middleware.rb
et en exigeant que fichier dansenvironment.rb
, en la réduisant à un seul besoin que je peux vivre avec.Je voudrais encore entendre comment d'autres personnes ont résolu ce qui semble être un problème de base de l'ajout d'un middleware pour les Rails.