Sobes.tech
Middle+

Comment fonctionne le cycle de traitement des requêtes dans Ruby on Rails?

sobes.tech IA

Réponse de l'IA

  1. Serveur web (par exemple, Puma, Unicorn): Reçoit la requête HTTP entrante.
  2. 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.
  3. 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.
  4. Retour via la pile de Middleware: L’objet de réponse passe de nouveau à travers la pile de middleware pour le traitement final.
  5. Rack: Transforme l’objet de réponse Rails en un format compréhensible par le serveur web.
  6. 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