Sobes.tech
Middle+

Hoe werkt de requestverwerkingcyclus in Ruby on Rails?

sobes.tech AI

Antwoord van AI

  1. Webserver (bijvoorbeeld Puma, Unicorn): Ontvangt het inkomende HTTP-verzoek.
  2. 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.
  3. 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.
  4. Terugkeer via Middleware Stack: Het antwoordobject doorloopt de middleware-stack terug voor de definitieve verwerking.
  5. Rack: Zet het Rails-antwoordobject om in een formaat dat door de webserver begrepen wordt.
  6. 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