Middle+
Comment fonctionne le cycle de traitement des requêtes dans Ruby on Rails?
sobes.tech IA
Réponse de l'IA
- Serveur web (par exemple, Puma, Unicorn): Reçoit la requête HTTP entrante.
- Rack: Interface entre le serveur web et l’application Rails. Le serveur web enveloppe la requête dans un objet Rack (environnement Rack), qui est transmis à l’application Rails.
- Application Rails: À l’intérieur de l’interface Rack, l’application Rails traite la requête. Les étapes principales:
- Pile de Middleware: Ensemble de programmes intermédiaires (middleware) qui effectuent diverses tâches avant et après le traitement de la requête (par exemple, routage, analyse des paramètres, mise en cache, gestion des sessions).
- Routeur: Détermine quel contrôleur et quelle action doivent traiter la requête en fonction de l’URL et de la méthode HTTP.
- Dispatcher: Dirige la requête vers le contrôleur et l’action trouvés.
- Contrôleur: Exécute la logique métier. Peut interagir avec des modèles (pour travailler avec des données) et rendre des vues.
- Vues: Les vues (modèles) génèrent du HTML, JSON ou d’autres formats de réponse. Peuvent utiliser des moteurs de templates (ERB, Haml, Slim).
- Réponse: Le contrôleur construit un objet de réponse qui inclut le statut HTTP, les en-têtes et le corps de la réponse.
- Retour via la pile de Middleware: L’objet de réponse passe de nouveau à travers la pile de middleware pour le traitement final.
- Rack: Transforme l’objet de réponse Rails en un format compréhensible par le serveur web.
- Serveur web: Envoie la réponse HTTP formée au client.
# Flux approximatif en pseudocode Rails
module Rails
class Application
def call(env) # env - c’est l’environnement Rack
# Pile de Middleware (simplifiée)
# Rails::Rack::Logger.new.call(env) -> ... -> Rails::Rack::Failsafe.new.call(env)
# Routage
request = ActionDispatch::Request.new(env)
route = Rails.application.routes.recognize(request) # Trouve la route correspondante
# Dispatch
controller_class = route[:controller].classify.constantize # Obtient la classe du contrôleur
controller_instance = controller_class.new
# Exécution de l’action
response = controller_instance.process(route[:action], request) # Appelle l’action du contrôleur
# Retour via Middleware
# ... (passage de retour à travers le middleware)
response.to_a # Convertit la réponse au format Rack [statut, en-têtes, corps]
end
end
end