Sobes.tech
Middle+

Цикли коркарии дар Ruby on Rails чӣ гуна кор мекунад?

sobes.tech AI

Ҷавоб аз AI

  1. Веб-сервер (напрыклад, Puma, Unicorn): Прымае ўваходны HTTP-запыт.
  2. Rack: Інтэрфейс паміж вэб-серверам і Rails-прыкладаннем. Вэб-сервер абгортвае запыт у аб'ект Rack (сярэдовішча Rack), які перадаецца ў Rails-прыкладанне.
  3. Rails Application: Унутры Rack-інтэрфейсу Rails-прыкладанне апрацоўвае запыт. Асноўныя этапы:
    • Middleware Stack: Набор прамежкавых праграм (middleware), якія выконваюць розныя задачы перад і пасля апрацоўкі запыту (напрыклад, маршрутызацыя, парсінг параметраў, кэшаванне, кіраванне сесіямі).
    • Router: Вызначае, які кантролер і дзеянне павінны апрацаваць запыт на аснове URL і HTTP-метаду.
    • Dispatcher: Напраўляе запыт да знойдзенага кантролера і дзеяння.
    • Controller: Выконвае бізнес-лагіку. Могуць узаемадзейнічаць з мадэлямі (для працы з дадзенымі) і рэндарыць прадстаўленні.
    • Views: Прадстаўленні (шаблоны) генеруюць HTML, JSON або іншыя фарматы адказу. Могуць выкарыстоўваць шаблонаізатары (ERB, Haml, Slim).
    • Response: Кантролер фарміруе аб'ект адказу, які ўключае статус HTTP, загалоўкі і цела адказу.
  4. Вяртанне праз Middleware Stack: Аб'ект адказу праходзіць назад праз стек middleware для канчатковай апрацоўкі.
  5. Rack: Ператварае аб'ект адказу Rails у фармат, зразумелы вэб-серверу.
  6. Вэб-сервер: Адпраўляе сфарміраваны 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