Sobes.tech
Middle

Em que momento o objeto controlador é criado e qual é o seu tempo de vida?

sobes.tech IA

Resposta da IA

O objeto controlador é criado no momento em que o Rails recebe uma requisição HTTP, que determina qual controlador e ação devem tratar a requisição.

A vida útil do objeto controlador é limitada a uma única requisição HTTP. Após processar a requisição e gerar a resposta, o Rails destrói o objeto controlador.

Isto acontece na seguinte ordem:

  1. Receção da requisição: O servidor web passa a requisição HTTP para a aplicação Rails.
  2. Roteamento: O Rails analisa a requisição e encontra o controlador e a ação correspondentes.
  3. Inicialização do controlador: O Rails cria uma nova instância da classe controlador definida pelo roteador.
  4. Execução da ação: O Rails chama o método de ação correspondente no objeto controlador criado.
  5. Processamento da requisição: O método de ação realiza a lógica, interagindo com modelos e possivelmente com outros serviços.
  6. Renderização da vista: O controlador prepara os dados para a vista e chama o seu render.
  7. Envio da resposta: O Rails forma a resposta HTTP, que inclui o resultado do render da vista (ou JSON ou outro formato), e envia ao cliente.
  8. Destruição do controlador: Após enviar a resposta, o objeto controlador e as variáveis relacionadas (por exemplo, @variáveis_de_instância) são eliminados pelo recolhedor de lixo do Ruby.
# Aproximadamente, como se parece ao nível do framework
# (não é código real do framework, mas um exemplo conceptual)

class Rails::Application
  def receive_request(request)
    # request - objeto de requisição HTTP
    route = Rails.application.routes.recognize(request)
    # route contém informações sobre o controlador e a ação

    controller_class = route.controller_class
    action_name = route.action_name

    # Criação de uma instância do controlador
    controller_instance = controller_class.new
    controller_instance.request = request

    # Execução da ação
    response = controller_instance.process(action_name)

    # Envio da resposta e destruição do objeto
    send_response(response)
    # O objeto controller_instance passa a ser candidato à recolha de lixo
  end
end

Desta forma, cada nova requisição HTTP leva à criação de uma nova instância independente do controlador. Isto garante que o estado de uma requisição não afeta o estado de outras requisições. As variáveis de instância (@) no controlador vivem exatamente enquanto dura o processamento de uma requisição específica.