Middle+
Цикли коркарии дар Ruby on Rails чӣ гуна кор мекунад?
sobes.tech AI
Ҷавоб аз AI
- Веб-сервер (напрыклад, Puma, Unicorn): Прымае ўваходны HTTP-запыт.
- Rack: Інтэрфейс паміж вэб-серверам і Rails-прыкладаннем. Вэб-сервер абгортвае запыт у аб'ект Rack (сярэдовішча Rack), які перадаецца ў Rails-прыкладанне.
- Rails Application: Унутры Rack-інтэрфейсу Rails-прыкладанне апрацоўвае запыт. Асноўныя этапы:
- Middleware Stack: Набор прамежкавых праграм (middleware), якія выконваюць розныя задачы перад і пасля апрацоўкі запыту (напрыклад, маршрутызацыя, парсінг параметраў, кэшаванне, кіраванне сесіямі).
- Router: Вызначае, які кантролер і дзеянне павінны апрацаваць запыт на аснове URL і HTTP-метаду.
- Dispatcher: Напраўляе запыт да знойдзенага кантролера і дзеяння.
- Controller: Выконвае бізнес-лагіку. Могуць узаемадзейнічаць з мадэлямі (для працы з дадзенымі) і рэндарыць прадстаўленні.
- Views: Прадстаўленні (шаблоны) генеруюць HTML, JSON або іншыя фарматы адказу. Могуць выкарыстоўваць шаблонаізатары (ERB, Haml, Slim).
- Response: Кантролер фарміруе аб'ект адказу, які ўключае статус HTTP, загалоўкі і цела адказу.
- Вяртанне праз Middleware Stack: Аб'ект адказу праходзіць назад праз стек middleware для канчатковай апрацоўкі.
- Rack: Ператварае аб'ект адказу Rails у фармат, зразумелы вэб-серверу.
- Вэб-сервер: Адпраўляе сфарміраваны HTTP-адказ кліенту.
# Прыблізны паток у псеўдакодзе Rails
module Rails
class Application
def call(env) # env - гэта Rack асяроддзе
# Middleware Stack (павярхоўна)
# Rails::Rack::Logger.new.call(env) -> ... -> Rails::Rack::Failsafe.new.call(env)
# Маршрутызацыя
request = ActionDispatch::Request.new(env)
route = Rails.application.routes.recognize(request) # Знаходзіць адпаведны маршрут
# Дыспетчарызацыя
controller_class = route[:controller].classify.constantize # Атрымае клас кантролера
controller_instance = controller_class.new
# Выкананне дзеяння
response = controller_instance.process(route[:action], request) # Выклікае дзеянне кантролера
# Вяртанне праз Middleware
# ... (вяртанне праз middleware)
response.to_a # Пераўтварае адказ у фармат Rack [статус, загалоўкі, цела]
end
end
end