Middle+
Ruby on Rails'ta istek işleme döngüsü nasıl çalışır?
sobes.tech yapay zeka
AI'dan gelen yanıt
- Web sunucu (örneğin, Puma, Unicorn): Gelen HTTP isteğini alır.
- 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.
- 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.
- Middleware Yığını aracılığıyla geri dönüş: Yanıt nesnesi, nihai işlem için middleware yığını boyunca geri geçer.
- Rack: Rails yanıt nesnesini, web sunucusunun anlayacağı formata dönüştürür.
- 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