Middle+
Jak funguje cyklus zpracování požadavků v Ruby on Rails?
sobes.tech AI
Odpověď od AI
- Webový server (například Puma, Unicorn): Přijímá příchozí HTTP požadavek.
- 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.
- 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.
- Návrat přes middleware stack: Objekt odpovědi prochází zpět přes middleware stack k finálnímu zpracování.
- Rack: Převádí objekt odpovědi Rails do formátu srozumitelného webovému serveru.
- 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