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