Middle+
Wie funktioniert der Anfrageverarbeitungszyklus in Ruby on Rails?
sobes.tech KI
Antwort von AI
- Webserver (z.B. Puma, Unicorn): Empfängt die eingehende HTTP-Anfrage.
- 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.
- 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.
- Rückgabe durch Middleware-Stack: Das Response-Objekt durchläuft den Middleware-Stack zurück für die endgültige Verarbeitung.
- Rack: Wandelt das Rails-Response-Objekt in ein vom Webserver verständliches Format um.
- 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