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:
- Receção da requisição: O servidor web passa a requisição HTTP para a aplicação Rails.
- Roteamento: O Rails analisa a requisição e encontra o controlador e a ação correspondentes.
- Inicialização do controlador: O Rails cria uma nova instância da classe controlador definida pelo roteador.
- Execução da ação: O Rails chama o método de ação correspondente no objeto controlador criado.
- Processamento da requisição: O método de ação realiza a lógica, interagindo com modelos e possivelmente com outros serviços.
- Renderização da vista: O controlador prepara os dados para a vista e chama o seu render.
- 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.
- 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.