Middle+
Kuidas töötab Ruby on Rails'is päringute töötlemise tsükkel?
sobes.tech AI
Vastus AI-lt
- Veebiserver (näiteks Puma, Unicorn): Võtab vastu sissetuleva HTTP-päringu.
- Rack: Liides veebiserveri ja Rails rakenduse vahel. Veebiserver pakib päringu Rack objekti (keskkond), mis edastatakse Rails rakendusele.
- 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.
- Tagasipöördumine Middleware Stack-i kaudu: Vastuse objekt läbib tagasi middleware steku lõplikuks töötlemiseks.
- Rack: Muudab Rails vastuse objekti veebiserveri mõistetavaks formaadiks.
- 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