Sobes.tech
Middle+

Jak funguje cyklus zpracování požadavků v Ruby on Rails?

sobes.tech AI

Odpověď od AI

  1. Webový server (například Puma, Unicorn): Přijímá příchozí HTTP požadavek.
  2. Rack: Rozhraní mezi webovým serverem a Rails aplikací. Webový server obaluje požadavek do objektu Rack (prostředí Rack), který je předán Rails aplikaci.
  3. Rails aplikace: Uvnitř Rack rozhraní Rails aplikace zpracovává požadavek. Hlavní kroky:
    • Middleware stack: Sada prostředníků (middleware), které vykonávají různé úkoly před a po zpracování požadavku (například směrování, analýza parametrů, cachování, správa relací).
    • Router: Určuje, který kontroler a akce mají zpracovat požadavek na základě URL a HTTP metody.
    • Dispatcher: Směřuje požadavek na nalezený kontroler a akci.
    • Kontroler: Provádí obchodní logiku. Může komunikovat s modely (pro práci s daty) a renderovat pohledy.
    • Pohledy: Šablony generují HTML, JSON nebo jiné formáty odpovědi. Mohou používat šablonové motory (ERB, Haml, Slim).
    • Odpověď: Kontroler vytváří objekt odpovědi, který obsahuje stav HTTP, hlavičky a tělo odpovědi.
  4. Návrat přes middleware stack: Objekt odpovědi prochází zpět přes middleware stack k finálnímu zpracování.
  5. Rack: Převádí objekt odpovědi Rails do formátu srozumitelného webovému serveru.
  6. Webový server: Odesílá sestavenou HTTP odpověď klientovi.
# Přibližný tok v pseudokódu Rails

module Rails
  class Application
    def call(env) # env - prostředí Rack
      # Middleware stack (zjednodušené)
      # Rails::Rack::Logger.new.call(env) -> ... -> Rails::Rack::Failsafe.new.call(env)

      # Routing
      request = ActionDispatch::Request.new(env)
      route = Rails.application.routes.recognize(request) # Najde odpovídající trasu

      # Dispatch
      controller_class = route[:controller].classify.constantize # Získá třídu kontroleru
      controller_instance = controller_class.new

      # Spuštění akce
      response = controller_instance.process(route[:action], request) # Zavolá akci kontroleru

      # Návrat přes middleware
      # ... (zpět přes middleware)

      response.to_a # Převádí odpověď do formátu Rack [stav, hlavičky, tělo]
    end
  end
end