Sobes.tech
Middle+

Kuidas töötab Ruby on Rails'is päringute töötlemise tsükkel?

sobes.tech AI

Vastus AI-lt

  1. Veebiserver (näiteks Puma, Unicorn): Võtab vastu sissetuleva HTTP-päringu.
  2. Rack: Liides veebiserveri ja Rails rakenduse vahel. Veebiserver pakib päringu Rack objekti (keskkond), mis edastatakse Rails rakendusele.
  3. Rails rakendus: Rack-liidese sees töötleb Rails rakendus päringut. Peamised etapid:
    • Middleware Stack: Vaheprogrammid (middleware), mis täidavad erinevaid ülesandeid enne ja pärast päringu töötlemist (näiteks marsruutimine, parameetrite analüüs, vahemälu, sessioonide haldus).
    • Router: Määrab, milline kontroller ja tegevus töötleb päringut URL-i ja HTTP-meetodi põhjal.
    • Dispatcher: Saatab päringu leitud kontrollerile ja tegevusele.
    • Controller: Teostab äriloogikat. Võib suhelda mudelitega (andmete töötlemiseks) ja genereerida vaateid.
    • Views: Vaated (mallid) genereerivad HTML-i, JSON-i või muid vastuse vorminguid. Võivad kasutada mallisüsteeme (ERB, Haml, Slim).
    • Response: Kontroller koostab vastuse objekti, mis sisaldab HTTP-staatuskoodi, päiseid ja vastuse keha.
  4. Tagasipöördumine Middleware Stack-i kaudu: Vastuse objekt läbib tagasi middleware steku lõplikuks töötlemiseks.
  5. Rack: Muudab Rails vastuse objekti veebiserveri mõistetavaks formaadiks.
  6. Veebiserver: Saadab koostatud HTTP-vastuse kliendile.
# Ligikaudne voog Rails pseudo-koodis

module Rails
  class Application
    def call(env) # env - Rack keskkond
      # Middleware stek (lihtsustatud)
      # Rails::Rack::Logger.new.call(env) -> ... -> Rails::Rack::Failsafe.new.call(env)

      # Marsruutimine
      request = ActionDispatch::Request.new(env)
      route = Rails.application.routes.recognize(request) # Leiab sobiva marsruudi

      # Dispetšerimine
      controller_class = route[:controller].classify.constantize # Saab kontrolleri klassi
      controller_instance = controller_class.new

      # Tegevuse täitmine
      response = controller_instance.process(route[:action], request) # Kutsub kontrolleri tegevuse

      # Tagasipöördumine Middleware kaudu
      # ... (tagasipöördumine middleware kaudu)

      response.to_a # Muudab vastuse Rack formaati [staatus, päised, keha]
    end
  end
end