Sobes.tech
Middle+

Wie funktioniert der Anfrageverarbeitungszyklus in Ruby on Rails?

sobes.tech KI

Antwort von AI

  1. Webserver (z.B. Puma, Unicorn): Empfängt die eingehende HTTP-Anfrage.
  2. Rack: Schnittstelle zwischen Webserver und Rails-Anwendung. Der Webserver umhüllt die Anfrage in ein Rack-Objekt (Rack-Umgebung), das an die Rails-Anwendung übergeben wird.
  3. Rails-Anwendung: Innerhalb der Rack-Schnittstelle verarbeitet die Rails-Anwendung die Anfrage. Die Hauptphasen:
    • Middleware-Stack: Sammlung von Zwischenprogrammen (Middleware), die verschiedene Aufgaben vor und nach der Anfrageverarbeitung ausführen (z.B. Routing, Parameter-Parsing, Caching, Sitzungsverwaltung).
    • Router: Bestimmt, welcher Controller und welche Aktion die Anfrage basierend auf URL und HTTP-Methode verarbeitet.
    • Dispatcher: Leitet die Anfrage an den gefundenen Controller und die Aktion weiter.
    • Controller: Führt die Geschäftslogik aus. Kann mit Modellen interagieren (für Datenzugriffe) und Ansichten rendern.
    • Views: Views (Templates) generieren HTML, JSON oder andere Antwortformate. Können Template-Engines (ERB, Haml, Slim) verwenden.
    • Response: Der Controller erstellt ein Response-Objekt, das HTTP-Status, Header und Body enthält.
  4. Rückgabe durch Middleware-Stack: Das Response-Objekt durchläuft den Middleware-Stack zurück für die endgültige Verarbeitung.
  5. Rack: Wandelt das Rails-Response-Objekt in ein vom Webserver verständliches Format um.
  6. Webserver: Sendet die erstellte HTTP-Antwort an den Client.
# Ungefährer Ablauf in Pseudocode für Rails

module Rails
  class Application
    def call(env) # env ist die Rack-Umgebung
      # Middleware-Stack (vereinfachte Darstellung)
      # Rails::Rack::Logger.new.call(env) -> ... -> Rails::Rack::Failsafe.new.call(env)

      # Routing
      request = ActionDispatch::Request.new(env)
      route = Rails.application.routes.recognize(request) # Findet die passende Route

      # Dispatch
      controller_class = route[:controller].classify.constantize # Holt die Controller-Klasse
      controller_instance = controller_class.new

      # Ausführung der Aktion
      response = controller_instance.process(route[:action], request) # Ruft die Controller-Aktion auf

      # Rückgabe durch Middleware
      # ... (Rückweg durch Middleware)

      response.to_a # Wandelt die Antwort in das Rack-Format [Status, Header, Body] um
    end
  end
end