Sobes.tech
Middle+

Ruby on Rails'da so'rovlarni qayta ishlash sikli qanday ishlaydi?

sobes.tech AI

AIdan javob

  1. Veb server (masalan, Puma, Unicorn): Kiruvchi HTTP so’rovni qabul qiladi.
  2. Rack: Veb server va Rails ilovasi o’rtasidagi interfeys. Veb server so’rovni Rack obyekti (Rack muhit) ga o’rab, Rails ilovasiga uzatadi.
  3. Rails ilovasi: Rack interfeys ichida, Rails ilovasi so’rovni qayta ishlaydi. Asosiy bosqichlar:
    • Middleware Stack: Turli vazifalarni bajaradigan oraliq dasturlar (middleware) to’plami, ular so’rovni qayta ishlashdan oldin va keyin bajariladi (masalan, marshrutlash, parametrlarni tahlil qilish, kechiktirish, sessiyalarni boshqarish).
    • Router: URL va HTTP metodiga asoslanib, so’rovni qaysi controller va action qayta ishlashini aniqlaydi.
    • Dispatcher: So’rovni topilgan controller va action ga yo’naltiradi.
    • Controller: Biznes mantiqini bajaradi. Model bilan hamkorlik qilishi mumkin (ma’lumotlar bilan ishlash uchun) va ko’rsatmalarni render qilishi mumkin.
    • Views: Ko’rsatmalar (shablonlar) HTML, JSON yoki boshqa javob formatlarini ishlab chiqaradi. ERB, Haml, Slim kabi shablon motorlaridan foydalanishi mumkin.
    • Response: Controller javob obyekti yaratadi, u HTTP holati, sarlavhalar va javob matnini o’z ichiga oladi.
  4. Middleware Stack orqali qaytish: Javob obyekti yakuniy ishlov uchun middleware stack orqali qaytadi.
  5. Rack: Rails javob obyekti veb server uchun tushunarli formatga o’zgartiriladi.
  6. Veb server: Yaratilgan HTTP javobni mijozga yuboradi.
# Rails pseudokodida taxminiy oqim

module Rails
  class Application
    def call(env) # env - Rack muhit
      # Middleware Stack (soddalashtirilgan)
      # Rails::Rack::Logger.new.call(env) -> ... -> Rails::Rack::Failsafe.new.call(env)

      # Marshrutlash
      request = ActionDispatch::Request.new(env)
      route = Rails.application.routes.recognize(request) # Mos keladigan marshrutni topadi

      # Dispatch
      controller_class = route[:controller].classify.constantize # Controller klassini oladi
      controller_instance = controller_class.new

      # Actionni bajarish
      response = controller_instance.process(route[:action], request) # Controller action ni chaqiradi

      # Middleware orqali qaytish
      # ... (middleware orqali qaytish)

      response.to_a # Javobni Rack formatiga aylantiradi [status, headers, body]
    end
  end
end