Middle
Wanneer wordt het controller-object gemaakt en wat is de levensduur ervan?
sobes.tech AI
Antwoord van AI
Het controller-object wordt aangemaakt op het moment dat Rails een HTTP-verzoek ontvangt, dat bepaalt welke controller en actie het verzoek moet verwerken.
De levensduur van het controller-object is beperkt tot één HTTP-verzoek. Na het verwerken van het verzoek en het genereren van de reactie, vernietigt Rails het controller-object.
Dit gebeurt in de volgende volgorde:
- Verzoek ontvangen: De webserver geeft het HTTP-verzoek door aan de Rails-toepassing.
- Routing: Rails analyseert het verzoek en vindt de juiste controller en actie.
- Initialisatie van de controller: Rails maakt een nieuwe instantie van de controllerklasse die door de router is gedefinieerd.
- Actie uitvoeren: Rails roept de bijbehorende methode van de actie aan op het aangemaakte controller-object.
- Verzoek verwerken: De actie-methode voert de logica uit, interacteert met modellen en mogelijk andere services.
- Weergave renderen: De controller bereidt de gegevens voor de weergave voor en roept deze aan.
- Reactie verzenden: Rails vormt de HTTP-reactie, inclusief het resultaat van de rendering (of JSON of een ander formaat), en stuurt deze naar de client.
- Controller vernietigen: Na het verzenden van de reactie worden het controller-object en de bijbehorende variabelen (bijvoorbeeld
@instantievariabelen) door de Ruby-garbage collector verwijderd.
# Bij benadering, zoals het eruitziet op framework-niveau
# (geen echte framework-code, maar een conceptueel voorbeeld)
class Rails::Application
def receive_request(request)
# request - HTTP-verzoekobject
route = Rails.application.routes.recognize(request)
# route bevat informatie over controller en actie
controller_class = route.controller_class
action_name = route.action_name
# Aanmaken van een controller-instantie
controller_instance = controller_class.new
controller_instance.request = request
# Actie uitvoeren
response = controller_instance.process(action_name)
# Reactie verzenden en object verwijderen
send_response(response)
# Het controller_instance-object wordt een kandidaat voor garbage collection
end
end
Op deze manier leidt elke nieuwe HTTP-verzoek tot het creëren van een nieuwe, onafhankelijke controller-instantie. Dit garandeert dat de staat van één verzoek de staat van andere verzoeken niet beïnvloedt. De instantievariabelen (@) in de controller blijven precies zo lang als het verwerken van één specifiek verzoek.