Middle+
Ako funguje cyklus spracovania požiadaviek v Ruby on Rails?
sobes.tech AI
Odpoveď od AI
- Web server (napríklad Puma, Unicorn): Prijíma prichádzajúci HTTP dopyt.
- Rack: Rozhranie medzi web serverom a Rails aplikáciou. Web server obalí dopyt do objektu Rack (prostredie Rack), ktorý sa odovzdá Rails aplikácii.
- Rails Application: Uvnitri Rack rozhrania Rails aplikácia spracováva dopyt. Hlavné kroky:
- Middleware Stack: Sada medzičlánkov (middleware), ktoré vykonávajú rôzne úlohy pred a po spracovaní dopytu (napríklad routovanie, parsovanie parametrov, cacheovanie, správa relácií).
- Router: Určuje, ktorý kontrolér a akcia majú spracovať dopyt na základe URL a HTTP metódy.
- Dispatcher: Odošle dopyt nájdenému kontroléru a akcii.
- Controller: Vykonáva biznis logiku. Môžu komunikovať s modelmi (na prácu s dátami) a renderovať pohľady.
- Views: Pohľady (šablóny) generujú HTML, JSON alebo iné formáty odpovede. Môžu používať šablónovacie systémy (ERB, Haml, Slim).
- Response: Kontrolér vytvára objekt odpovede, ktorý obsahuje HTTP status, hlavičky a telo odpovede.
- Návrat cez Middleware Stack: Objekt odpovede prechádza späť cez middleware stack na finálne spracovanie.
- Rack: Prevodí objekt odpovede Rails do formátu zrozumiteľného web serveru.
- Web server: Odosiela vytvorenú HTTP odpoveď klientovi.
# Približný tok v pseudokóde Rails
module Rails
class Application
def call(env) # env - je Rack prostredie
# 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) # Nájde zodpovedajúci route
# Dispatching
controller_class = route[:controller].classify.constantize # Získa triedu kontroléra
controller_instance = controller_class.new
# Spustenie akcie
response = controller_instance.process(route[:action], request) # Zavolá akciu kontroléra
# Návrat cez Middleware
# ... (návrat cez middleware)
response.to_a # Prevod odpovede do formátu Rack [status, hlavičky, telo]
end
end
end