Sobes.tech
Middle+

Ruby on Rails-də sorğu emalı dövrü necə işləyir?

sobes.tech Süni İntellekt

AI-dan cavab

  1. Veb server (məsələn, Puma, Unicorn): Gələn HTTP sorğusunu qəbul edir.
  2. Rack: Veb server və Rails tətbiqi arasında interfeysdir. Veb server sorğunu Rack obyekti (Rack mühiti) daxilində sarıyır və Rails tətbiqinə ötürür.
  3. Rails Tətbiqi: Rack interfeysində, Rails tətbiqi sorğunu emal edir. Əsas mərhələlər:
    • Middleware Stack: Müxtəlif tapşırıqları yerinə yetirən aralıq proqramlar (middleware), sorğunun işlənməsindən əvvəl və sonra (məsələn, marşrutlaşdırma, parametrlərin təhlili, keşik, sessiyaların idarə olunması).
    • Router: URL və HTTP metoduna əsaslanaraq, sorğunu hansı controller və əməliyyatın emal edəcəyini müəyyən edir.
    • Dispatcher: Sorğunu tapılmış controller və əməliyyətə yönəldir.
    • Controller: Biznes məntiqini yerinə yetirir. Məlumatlar ilə işləmək üçün modellərlə qarşılıqlı əlaqə qura bilər və görünüşləri render edə bilər.
    • Views: Görünüşlər (şablonlar) HTML, JSON və ya digər cavab formatlarını yaradır. ERB, Haml, Slim kimi şablon mühərriklərindən istifadə edə bilər.
    • Response: Controller cavab obyektini yaradır, o, HTTP statusu, başlıqlar və cavabın gövdəsini əhatə edir.
  4. Middleware Stack vasitəsilə geri dönüş: Cavab obyekti, son işləmə üçün middleware stack vasitəsilə geri keçir.
  5. Rack: Rails cavab obyektini veb server üçün başa düşülən formata çevirir.
  6. Veb server: Yaradılmış HTTP cavabını müştəriyə göndərir.
# Rails pseudokodunda təxmini axın

module Rails
  class Application
    def call(env) # env - Rack mühiti
      # Middleware Stack (sadələşdirilmiş)
      # Rails::Rack::Logger.new.call(env) -> ... -> Rails::Rack::Failsafe.new.call(env)

      # Routing
      request = ActionDispatch::Request.new(env)
      route = Rails.application.routes.recognize(request) # Uyğun marşrutu tapır

      # Dispatch
      controller_class = route[:controller].classify.constantize # Controller sinfini alır
      controller_instance = controller_class.new

      # Əməliyyatın yerinə yetirilməsi
      response = controller_instance.process(route[:action], request) # Controller əməliyyatını çağırır

      # Middleware vasitəsilə geri dönüş
      # ... (middleware vasitəsilə geri dönüş)

      response.to_a # Cavabı Rack formatına çevirir [status, headers, body]
    end
  end
end