Sobes.tech
Middle+

Ako funguje cyklus spracovania požiadaviek v Ruby on Rails?

sobes.tech AI

Odpoveď od AI

  1. Web server (napríklad Puma, Unicorn): Prijíma prichádzajúci HTTP dopyt.
  2. Rack: Rozhranie medzi web serverom a Rails aplikáciou. Web server obalí dopyt do objektu Rack (prostredie Rack), ktorý sa odovzdá Rails aplikácii.
  3. Rails Application: Uvnitri Rack rozhrania Rails aplikácia spracováva dopyt. Hlavné kroky:
    • Middleware Stack: Sada medzičlánkov (middleware), ktoré vykonávajú rôzne úlohy pred a po spracovaní dopytu (napríklad routovanie, parsovanie parametrov, cacheovanie, správa relácií).
    • Router: Určuje, ktorý kontrolér a akcia majú spracovať dopyt na základe URL a HTTP metódy.
    • Dispatcher: Odošle dopyt nájdenému kontroléru a akcii.
    • Controller: Vykonáva biznis logiku. Môžu komunikovať s modelmi (na prácu s dátami) a renderovať pohľady.
    • Views: Pohľady (šablóny) generujú HTML, JSON alebo iné formáty odpovede. Môžu používať šablónovacie systémy (ERB, Haml, Slim).
    • Response: Kontrolér vytvára objekt odpovede, ktorý obsahuje HTTP status, hlavičky a telo odpovede.
  4. Návrat cez Middleware Stack: Objekt odpovede prechádza späť cez middleware stack na finálne spracovanie.
  5. Rack: Prevodí objekt odpovede Rails do formátu zrozumiteľného web serveru.
  6. Web server: Odosiela vytvorenú HTTP odpoveď klientovi.
# Približný tok v pseudokóde Rails

module Rails
  class Application
    def call(env) # env - je Rack prostredie
      # Middleware Stack (zjednodušené)
      # Rails::Rack::Logger.new.call(env) -> ... -> Rails::Rack::Failsafe.new.call(env)

      # Routing
      request = ActionDispatch::Request.new(env)
      route = Rails.application.routes.recognize(request) # Nájde zodpovedajúci route

      # Dispatching
      controller_class = route[:controller].classify.constantize # Získa triedu kontroléra
      controller_instance = controller_class.new

      # Spustenie akcie
      response = controller_instance.process(route[:action], request) # Zavolá akciu kontroléra

      # Návrat cez Middleware
      # ... (návrat cez middleware)

      response.to_a # Prevod odpovede do formátu Rack [status, hlavičky, telo]
    end
  end
end