Middle+
Hoe werkt de requestverwerkingcyclus in Ruby on Rails?
sobes.tech AI
Antwoord van AI
- Webserver (bijvoorbeeld Puma, Unicorn): Ontvangt het inkomende HTTP-verzoek.
- Rack: Interface tussen de webserver en de Rails-toepassing. De webserver wikkelt het verzoek in een Rack-object (Rack-omgeving), dat wordt doorgegeven aan de Rails-toepassing.
- Rails-toepassing: Binnen de Rack-interface verwerkt de Rails-toepassing het verzoek. De hoofd fasen:
- Middleware Stack: Set van tussenprogramma’s (middleware) die verschillende taken uitvoeren vóór en na de verwerking van het verzoek (bijvoorbeeld routing, parameter parsing, caching, sessiebeheer).
- Router: Bepaalt welke controller en actie het verzoek moeten verwerken op basis van URL en HTTP-methode.
- Dispatcher: Stuurt het verzoek naar de gevonden controller en actie.
- Controller: Voert de bedrijfslogica uit. Kan samenwerken met modellen (voor werken met gegevens) en weergaven renderen.
- Views: Views (sjablonen) genereren HTML, JSON of andere antwoordformaten. Kan gebruik maken van sjabloontalen (ERB, Haml, Slim).
- Response: De controller maakt een antwoordobject dat de HTTP-status, headers en de inhoud van het antwoord bevat.
- Terugkeer via Middleware Stack: Het antwoordobject doorloopt de middleware-stack terug voor de definitieve verwerking.
- Rack: Zet het Rails-antwoordobject om in een formaat dat door de webserver begrepen wordt.
- Webserver: Stuurt het gevormde HTTP-antwoord naar de client.
# Approximate flow in pseudocode Rails
module Rails
class Application
def call(env) # env - Rack-omgeving
# Middleware Stack (vereenvoudigd)
# Rails::Rack::Logger.new.call(env) -> ... -> Rails::Rack::Failsafe.new.call(env)
# Routing
request = ActionDispatch::Request.new(env)
route = Rails.application.routes.recognize(request) # Vindt de juiste route
# Dispatch
controller_class = route[:controller].classify.constantize # Krijgt de controllerklasse
controller_instance = controller_class.new
# Uitvoeren van de actie
response = controller_instance.process(route[:action], request) # Roept de controlleractie aan
# Terugkeer via Middleware
# ... (terug door middleware)
response.to_a # Zet de reactie om in Rack-formaat [status, headers, body]
end
end
end