Middle+
Hogyan működik a kérésfeldolgozási ciklus a Ruby on Rails-ben?
sobes.tech MI
Válasz az MI-től
- Web szerver (pl. Puma, Unicorn): Fogadja a bejövő HTTP-kérést.
- Rack: Interfész a web szerver és a Rails alkalmazás között. A web szerver becsomagolja a kérést egy Rack-objektumba (Rack-környezet), amit átad a Rails alkalmazásnak.
- Rails alkalmazás: A Rack-környezeten belül a Rails alkalmazás feldolgozza a kérést. A fő lépések:
- Middleware verem: Különböző feladatokat végző közbenső programok (middleware), amelyek a kérés feldolgozása előtt és után futnak (pl. útvonalkezelés, paraméterek elemzése, gyorsítótárazás, munkamenetek kezelése).
- Router: Meghatározza, hogy melyik vezérlő és művelet dolgozza fel a kérést az URL és a HTTP-metódus alapján.
- Diszpécser: A kérés irányítása a megtalált vezérlő és művelet felé.
- Vezérlő: Üzleti logikát hajt végre. Interakcióba léphet modellekkel (az adatokkal való munkához) és nézeteket renderelhet.
- Nézetek: A nézetek (sablonok) HTML-t, JSON-t vagy más válaszformátumokat generálnak. Használhatnak sablonmotorokat (ERB, Haml, Slim).
- Válasz: A vezérlő létrehoz egy válaszobjektumot, amely tartalmazza az HTTP státuszt, a fejlécet és a válasz testét.
- Visszatérés Middleware veremen keresztül: A válaszobjektum visszafelé halad a middleware verem mentén a végső feldolgozásig.
- Rack: Átalakítja a Rails válaszobjektumát egy a web szerver által értelmezhető formátummá.
- Web szerver: A kialakított HTTP-választ küldi a kliensnek.
# Közelítő folyamat pseudokódban Rails
module Rails
class Application
def call(env) # env - Rack környezet
# Middleware verem (egyszerűsített)
# Rails::Rack::Logger.new.call(env) -> ... -> Rails::Rack::Failsafe.new.call(env)
# Útvonalkezelés
request = ActionDispatch::Request.new(env)
route = Rails.application.routes.recognize(request) # Megfelelő útvonal megtalálása
# Diszpécser
controller_class = route[:controller].classify.constantize # Vezérlő osztályának lekérése
controller_instance = controller_class.new
# Művelet végrehajtása
response = controller_instance.process(route[:action], request) # Vezérlő művelet hívása
# Visszatérés Middleware-en keresztül
# ... (vissza a middleware-hez)
response.to_a # Válasz Rack formátumba való átalakítása [állapot, fejléc, test]
end
end
end