Sobes.tech
Middle+

Ruby on Rails'ta istek işleme döngüsü nasıl çalışır?

sobes.tech yapay zeka

AI'dan gelen yanıt

  1. Web sunucu (örneğin, Puma, Unicorn): Gelen HTTP isteğini alır.
  2. Rack: Web sunucusu ile Rails uygulaması arasında arayüz. Web sunucusu, isteği Rack nesnesi (Rack ortamı) içine sarar ve Rails uygulamasına iletir.
  3. Rails Uygulaması: Rack arayüzü içinde, Rails uygulaması isteği işler. Ana aşamalar:
    • Middleware Yığını: İstek işlenmeden önce ve sonra çeşitli görevleri yerine getiren ara yazılımlar (middleware) kümesi (örneğin, yönlendirme, parametre çözümleme, önbellekleme, oturum yönetimi).
    • Yönlendirici: URL ve HTTP metoduna göre isteği hangi denetleyici ve eylemin işleyeceğine karar verir.
    • Dağıtıcı: İsteği bulunan denetleyici ve eyleme yönlendirir.
    • Denetleyici: İş mantığını yürütür. Modellerle etkileşime geçebilir (veri ile çalışmak için) ve görünümleri render edebilir.
    • Görünümler: Şablonlar (templates), HTML, JSON veya diğer yanıt formatlarını üretir. ERB, Haml, Slim gibi şablon motorları kullanılabilir.
    • Yanıt: Denetleyici, HTTP durumu, başlıklar ve yanıt gövdesini içeren yanıt nesnesi oluşturur.
  4. Middleware Yığını aracılığıyla geri dönüş: Yanıt nesnesi, nihai işlem için middleware yığını boyunca geri geçer.
  5. Rack: Rails yanıt nesnesini, web sunucusunun anlayacağı formata dönüştürür.
  6. Web sunucusu: Oluşan HTTP yanıtını istemciye gönderir.
# Rails pseudokodunda yaklaşık akış

module Rails
  class Application
    def call(env) # env - Rack ortamı
      # Middleware Yığını (basitleştirilmiş)
      # Rails::Rack::Logger.new.call(env) -> ... -> Rails::Rack::Failsafe.new.call(env)

      # Yönlendirme
      request = ActionDispatch::Request.new(env)
      route = Rails.application.routes.recognize(request) # Uygun rotayı bulur

      # Dağıtım
      controller_class = route[:controller].classify.constantize # Denetleyici sınıfını alır
      controller_instance = controller_class.new

      # Eylem yürütme
      response = controller_instance.process(route[:action], request) # Denetleyici eylemini çağırır

      # Middleware aracılığıyla geri dönüş
      # ... (middleware boyunca geri geçiş)

      response.to_a # Yanıtı Rack formatına dönüştürür [durum, başlıklar, gövde]
    end
  end
end