Middle+
Kaip veikia užklausų apdorojimo ciklas Ruby on Rails?
sobes.tech AI
Atsakymas iš AI
- Tinklalapio serveris (pavyzdžiui, Puma, Unicorn): Priima įeinantį HTTP užklausą.
- Rack: Sąsaja tarp tinklalapio serverio ir Rails programos. Tinklalapio serveris įkapsuliuoja užklausą į Rack objektą (Rack aplinka), kuris perduodamas Rails programai.
- 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į.
- Grįžimas per Middleware Stack: Atsakymo objektas grįžta atgal per middleware stack galutiniam apdorojimui.
- Rack: Paverčia Rails atsakymo objektą į formatą, suprantamą tinklalapio serveriui.
- 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