Forma correta de renderizar condicionalmente texto em um template — ou VALUE modificado duas vezes em uma única renderização

Tenho um plugin que (quase) cria Droplets no Digital Ocean e instala o Discourse.

Tenho uma página com um template que renderiza informações sobre o Modelo do Rails, o droplet que ele cria e a instância do Discourse que é instalada no droplet. Tenho todas as informações necessárias fluindo entre o Rails e o Ember usando o MessageBus. Quero exibir conteúdos diferentes dependendo de:

  • se há informações suficientes para criar o droplet;
  • se a tarefa que cria o droplet está em execução (ela atualiza coisas no modelo);
  • se o Discourse foi instalado.

Estou recebendo constantemente o seguinte erro:

   Você modificou "hasStatus" duas vezes em <@ember/component:ember660> em uma única renderização.

EDIT: Bem, isso foi porque eu tinha duas funções computed observando a mesma coisa…

Acho que finalmente percebi que não consigo fazer isso usando algo como {{#if hasStatus}} (que é uma função computada) no template, já que a página precisará ser re-renderizada para exibir o status depois que o usuário clicar no botão “criar droplet” (pois isso definirá a variável installation_status, que mostra o que está acontecendo durante a instalação).

Ou talvez eu esteja cometendo algum outro erro que esteja desencadeando isso, e o que estou fazendo deveria funcionar?

Então, acho que o que preciso fazer é usar CSS para ocultar os vários elementos?

1 curtida

Bem, como costuma acontecer quando posto coisas assim, a resposta é ainda mais bizarra do que eu poderia imaginar.

Se eu usar coisas como {{#if server.value}} e tiver value enviado pelo MessageBus, funciona como esperado quando faço uma atualização do console do Rails. Posso definir como nil/não nil e a seção da página aparece/desaparece conforme o esperado. Quando executo minha tarefa do Ansible a partir de um terminal, o Ansible envia um novo valor por uma rota, que atualiza o registro, que por sua vez envia para o message bus, e a seção do template aparece como esperado.

Mas, se o Ansible for executado por um job do Discourse, ainda vejo o Rails afirmando que está enviando as coisas para o message bus. E vejo no console de JavaScript do navegador que uma função computada que rastreia esse valor está sendo acionada e o valor é nulo. Se eu recarregar o navegador, os dados estão lá e a página é renderizada conforme o esperado. Talvez isso seja alguma peculiaridade do ambiente de desenvolvimento e será diferente em produção.

Talvez isso esteja relacionado?

Bem, ainda estou preocupado com esse erro, mas adicionei

         window.location.reload(true);

à minha ação e a página é recarregada e tudo parece funcionar depois disso.

1 curtida