Sobes.tech
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:

  1. Verzoek ontvangen: De webserver geeft het HTTP-verzoek door aan de Rails-toepassing.
  2. Routing: Rails analyseert het verzoek en vindt de juiste controller en actie.
  3. Initialisatie van de controller: Rails maakt een nieuwe instantie van de controllerklasse die door de router is gedefinieerd.
  4. Actie uitvoeren: Rails roept de bijbehorende methode van de actie aan op het aangemaakte controller-object.
  5. Verzoek verwerken: De actie-methode voert de logica uit, interacteert met modellen en mogelijk andere services.
  6. Weergave renderen: De controller bereidt de gegevens voor de weergave voor en roept deze aan.
  7. 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.
  8. 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.