Sobes.tech
Middle+

Kaip veikia užklausų apdorojimo ciklas Ruby on Rails?

sobes.tech AI

Atsakymas iš AI

  1. Tinklalapio serveris (pavyzdžiui, Puma, Unicorn): Priima įeinantį HTTP užklausą.
  2. Rack: Sąsaja tarp tinklalapio serverio ir Rails programos. Tinklalapio serveris įkapsuliuoja užklausą į Rack objektą (Rack aplinka), kuris perduodamas Rails programai.
  3. Rails programa: Viduje Rack sąsajos Rails programa apdoroja užklausą. Pagrindiniai etapai:
    • Middleware Stack: Tarpinių programų rinkinys, atliekantis įvairius užduotis prieš ir po užklausos apdorojimo (pavyzdžiui, maršrutizavimas, parametrų analizė, talpyklos naudojimas, sesijų valdymas).
    • Router: Nustato, kuris kontroleris ir veiksmas turi apdoroti užklausą pagal URL ir HTTP metodą.
    • Dispatcher: Nukreipia užklausą į rastą kontrolerį ir veiksmą.
    • Controller: Atlieka verslo logiką. Gali sąveikauti su modeliais (duomenų tvarkymui) ir generuoti vaizdus.
    • Views: Vaizdai (šablonai) generuoja HTML, JSON ar kitus atsakymo formatus. Gali naudoti šablonų sistemą (ERB, Haml, Slim).
    • Response: Kontroleris sukuria atsakymo objektą, kuris apima HTTP būseną, antraštes ir atsakymo turinį.
  4. Grįžimas per Middleware Stack: Atsakymo objektas grįžta atgal per middleware stack galutiniam apdorojimui.
  5. Rack: Paverčia Rails atsakymo objektą į formatą, suprantamą tinklalapio serveriui.
  6. Tinklalapio serveris: Išsiunčia suformuotą HTTP atsakymą klientui.
# Apytikslis srautas Rails pseudo-kode

module Rails
  class Application
    def call(env) # env - tai Rack aplinka
      # Middleware Stack (supaprastinta)
      # Rails::Rack::Logger.new.call(env) -> ... -> Rails::Rack::Failsafe.new.call(env)

      # Maršrutizavimas
      request = ActionDispatch::Request.new(env)
      route = Rails.application.routes.recognize(request) # Randa atitinkamą maršrutą

      # Dispečerinimas
      controller_class = route[:controller].classify.constantize # Gaukia kontrolerio klasę
      controller_instance = controller_class.new

      # Veiksmų vykdymas
      response = controller_instance.process(route[:action], request) # Iškviečia kontrolerio veiksmą

      # Grįžimas per Middleware
      # ... (grįžimas per middleware)

      response.to_a # Paverčia atsakymą į Rack formatą [statusas, antraštės, turinys]
    end
  end
end