44 votes

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 vendor/middleware ou peut - vendor/plugins/middleware...

Le plus gros problème est d'avoir à demander à la personne de fichiers en haut de l' config/environment.rb

require "app/middleware/system_message"
require "app/middleware/rack_backstage"

sinon je obtenir uninitialized constant des erreurs sur l' config.middleware.use des 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?


La réponse spécifique, je suis à la recherche de cette prime est: 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 des 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 en lib (ou un bijou énumérés à l' Gemfile) et sont nécessaires et chargé en config.ru.

48voto

Mike Jarema Points 528

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 (notez 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):

config.middleware.use CanonicalHost, "example.com"

Si vous ajoutez un middleware pour l'application.rb, vous aurez besoin d'inclure les guillemets, comme par @mltsy commentaire.

config.middleware.use "CanonicalHost", "example.com"

25voto

Chris Heald Points 28814

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:

config.middleware.use "MyApp::TotallyAwesomeMiddleware"

Vous souhaitez garder dans:

lib/my_app/totally_awesome_middleware.rb

Rails de 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:

>> ChrisHeald::StdLib.to_s.tableize.singularize
=> "chris_heald/std_lib"

Donc, mon stdlib vie en lib/chris_heald/std_lib.rb, et est chargé lorsque je de référence dans le code.

11voto

Craig Walker Points 13478

Dans mon Rails 3.2 application, j'ai pu obtenir mon middleware TrafficCop chargement en le mettant à l' app/middleware/traffic_cop.rb, tout comme @MikeJarema décrit. Ensuite, j'ai ajouté cette ligne dans mon config/application.rb, comme indiqué:

config.middleware.use TrafficCop

Cependant, lors du démarrage de l'application, j'ai continué à obtenir cette erreur:

uninitialized constant MyApp::Application::TrafficCop

De spécifier explicitement l'espace de noms racine n'a pas aidé non plus:

config.middleware.use ::TrafficCop
# uninitialized constant TrafficCop

Pour une raison quelconque (que j'ai encore à découvrir), à ce point dans les Rails du cycle de vie, app/middleware n'est pas incluse dans les chemins de chargement. Si j'ai enlevé l' config.middleware.use de la ligne, et a couru la console, j'ai pu accéder à l' TrafficCop constante sans aucun problème. Mais il ne pouvait pas le trouver dans app/middleware au temps de configuration.

J'ai fixé ce, en joignant le middleware de la classe de nom entre guillemets, comme ceci:

config.middleware.use "TrafficCop"

De cette façon, je voudrais éviter de l' uninitialized constant d'erreur, puisque les Rails n'est pas en essayant de trouver l' TrafficCop classe pour l'instant. Mais, quand il commence à construire la pile de middleware, il constantize la chaîne. En ce moment, app/middleware est à la charge des chemins, et donc la classe va se charger correctement.

5voto

yfeldblum Points 42613

Pour Rails 3:

#config/application.rb
require 'lib/rack/my_adapter.rb'
module MyApp
  class Application < Rails::Application
    config.middleware.use Rack::MyAdapter
  end
end

0voto

John Topley Points 58789

Je ne suis pas au courant d'une convention, mais pourquoi ne pas le mettre dans l' /lib annuaire? Les fichiers là obtenir automatiquement chargé par les Rails.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X