Sobes.tech
Middle+

Kako funkcioniše ciklus obrade zahteva u Ruby on Rails?

sobes.tech АИ

Одговор од АИ

  1. Veb server (na primer, Puma, Unicorn): Prima dolazni HTTP zahtev.
  2. Rack: Interfejs između veb servera i Rails aplikacije. Veb server obavija zahtev u Rack objekat (okruženje Rack), koji se prosleđuje Rails aplikaciji.
  3. Rails aplikacija: Unutar Rack okruženja, Rails aplikacija obrađuje zahtev. Glavni koraci:
    • Middleware stek: Skup međuprograma (middleware) koji obavljaju razne zadatke pre i posle obrade zahteva (npr. rutiranje, analiza parametara, keširanje, upravljanje sesijama).
    • Router: Određuje koji kontroler i akcija treba da obrade zahtev na osnovu URL-a i HTTP metode.
    • Dispečer: Usmerava zahtev do pronađenog kontrolera i akcije.
    • Kontroler: Izvršava poslovnu logiku. Može da komunicira sa modelima (za rad sa podacima) i da renderuje prikaze.
    • Prikazi: Prikazi (šabloni) generišu HTML, JSON ili druge formate odgovora. Mogu koristiti šablonske motore (ERB, Haml, Slim).
    • Odgovor: Kontroler kreira objekat odgovora koji uključuje HTTP status, zaglavlja i telo odgovora.
  4. Povratak kroz Middleware stek: Objekat odgovora prolazi nazad kroz middleware stek do završne obrade.
  5. Rack: Pretvara objekat odgovora Rails u format razumljiv veb serveru.
  6. Veb server: Šalje formirani HTTP odgovor klijentu.
# Aproksimativni tok u pseudokodu Rails

module Rails
  class Application
    def call(env) # env - Rack okruženje
      # Middleware stek (pojednostavljeno)
      # Rails::Rack::Logger.new.call(env) -> ... -> Rails::Rack::Failsafe.new.call(env)

      # Rutiranje
      request = ActionDispatch::Request.new(env)
      route = Rails.application.routes.recognize(request) # Pronalazi odgovarajući put

      # Dispečovanje
      controller_class = route[:controller].classify.constantize # Dobija klasu kontrolera
      controller_instance = controller_class.new

      # Izvršavanje akcije
      response = controller_instance.process(route[:action], request) # Poziva akciju kontrolera

      # Povratak kroz Middleware
      # ... (nazad kroz middleware)

      response.to_a # Pretvara odgovor u Rack format [status, headers, body]
    end
  end
end