Sobes.tech
Middle+

Como funciona o ciclo de processamento de pedidos no Ruby on Rails?

sobes.tech IA

Resposta da IA

  1. Servidor web (por exemplo, Puma, Unicorn): Recebe a requisição HTTP de entrada.
  2. Rack: Interface entre o servidor web e a aplicação Rails. O servidor web envolve a requisição num objeto Rack (ambiente Rack), que é passado para a aplicação Rails.
  3. Aplicação Rails: Dentro da interface Rack, a aplicação Rails processa a requisição. As principais etapas:
    • Pilha de Middleware: Conjunto de programas intermédios (middleware) que realizam várias tarefas antes e depois do processamento da requisição (por exemplo, roteamento, análise de parâmetros, cache, gestão de sessões).
    • Roteador: Determina qual controlador e ação devem processar a requisição com base na URL e no método HTTP.
    • Despachante: Direciona a requisição para o controlador e ação encontrados.
    • Controlador: Executa a lógica de negócio. Pode interagir com modelos (para trabalhar com dados) e renderizar vistas.
    • Vistas: As vistas (modelos) geram HTML, JSON ou outros formatos de resposta. Podem usar motores de templates (ERB, Haml, Slim).
    • Resposta: O controlador constrói um objeto de resposta que inclui o estado HTTP, cabeçalhos e corpo da resposta.
  4. Retorno através da Pilha de Middleware: O objeto de resposta passa de volta através da pilha de middleware para o processamento final.
  5. Rack: Transforma o objeto de resposta do Rails num formato compreensível para o servidor web.
  6. Servidor web: Envia a resposta HTTP formada ao cliente.
# Fluxo aproximado em pseudocódigo Rails

module Rails
  class Application
    def call(env) # env - é o ambiente Rack
      # Pilha de Middleware (simplificada)
      # Rails::Rack::Logger.new.call(env) -> ... -> Rails::Rack::Failsafe.new.call(env)

      # Roteamento
      request = ActionDispatch::Request.new(env)
      route = Rails.application.routes.recognize(request) # Encontra a rota correspondente

      # Despacho
      controller_class = route[:controller].classify.constantize # Obtém a classe do controlador
      controller_instance = controller_class.new

      # Execução da ação
      response = controller_instance.process(route[:action], request) # Chama a ação do controlador

      # Retorno através de Middleware
      # ... (passagem de volta através do middleware)

      response.to_a # Converte a resposta para o formato Rack [estado, cabeçalhos, corpo]
    end
  end
end