Sobes.tech
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

  1. Web szerver (pl. Puma, Unicorn): Fogadja a bejövő HTTP-kérést.
  2. 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.
  3. 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.
  4. Visszatérés Middleware veremen keresztül: A válaszobjektum visszafelé halad a middleware verem mentén a végső feldolgozásig.
  5. Rack: Átalakítja a Rails válaszobjektumát egy a web szerver által értelmezhető formátummá.
  6. 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