Sobes.tech
Middle+

Ինչպես է աշխատում Ruby on Rails-ում հարցման մշակման ցիկլը։

sobes.tech AI

Պատասխան AI-ից

  1. Վեբ սերվեր (օրինակ, Puma, Unicorn): Ստացվում է մուտքային HTTP հարցումը:
  2. Rack: Միջերես՝ վեբ սերվերի և Rails հավելվածի միջև: Վեբ սերվերը հարցումը փաթեթավորում է Rack օբյեկտի մեջ (Rack միջավայր), որը փոխանցվում է Rails հավելվածին:
  3. Rails հավելված: Rack միջավայրի ներսում Rails հավելվածը մշակում է հարցումը: Հիմնական փուլերը՝
    • Middleware Stack: Միջանկյալ ծրագրերի հավաքածու, որոնք կատարում են տարբեր գործառույթներ հարցման մշակման նախ և հետո (օրինակ, ռոուտինգ, պարամետրերի վերլուծում, կեշավորում, սեսիաների կառավարում):
    • Router: Կնորոշում է, թե որ կոնտրոլեր և գործողություն պետք է մշակեն հարցումը URL և HTTP մեթոդի հիման վրա:
    • Dispatcher: Ուղղում է հարցումը գտած կոնտրոլերին և գործողությանը:
    • Controller: Կատարում է բիզնես տրամաբանությունը: Կարող է փոխազդել մոդելների հետ (տվյալների աշխատանքի համար) և ռենդերել ներկայացումները:
    • Views: Ներկայացումները (թեմպլեյթները) ստեղծում են HTML, JSON կամ այլ պատասխան ձևաչափեր: Կարող են օգտագործել թեմպլեյտորներ (ERB, Haml, Slim):
    • Response: Կոնտրոլերը ձևավորում է պատասխան օբյեկտ, որը ներառում է HTTP կարգավիճակ, գլխագրեր և պատասխան մարմին:
  4. Վերադարձ middleware stack-ով: Պատասխան օբյեկտը անցնում է հետ՝ middleware stack-ով՝ վերջնական մշակման համար:
  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