Правильный способ условного рендеринга текста в шаблоне — или модификация VALUE дважды за один рендер

У меня есть плагин, который (почти) создает Droplet в Digital Ocean и устанавливает Discourse.

У меня есть страница с шаблоном, который отображает данные о модели Rails, создаваемом Droplet и экземпляре Discourse, устанавливаемом на этом Droplet. Вся необходимая информация передается между Rails и Ember через MessageBus. Мне нужно отображать разный контент в зависимости от того:

  • достаточно ли данных для создания Droplet;
  • выполняется ли задача по созданию Droplet (она обновляет данные в модели);
  • установлен ли Discourse.

Я постоянно получаю ошибку:

   You modified "hasStatus" twice on <@ember/component:ember660> в одном рендере.

РЕДАКТИРОВАНИЕ: Оказалось, что это произошло из-за того, что у меня было две функции computed, отслеживающие одно и то же…

Кажется, я наконец понял, что не могу использовать конструкцию {{#if hasStatus}} (где hasStatus — это функция computed) в шаблоне, так как страницу придется перерендеривать, чтобы отобразить статус после нажатия кнопки «Создать Droplet» (ведь тогда будет установлен переменная installation_status, которая показывает, что происходит в процессе установки).

Или, возможно, у меня есть какая-то другая ошибка, вызывающая это, и то, что я делаю, должно работать?

Так что, наверное, мне нужно использовать <gasp> CSS, чтобы скрывать различные элементы?

Что ж, как это часто бывает, когда я публикую подобные вещи, ответ оказывается ещё более странным, чем я мог себе представить.

Если я использую что-то вроде {{#if server.value}} и значение value обновляется через MessageBus, то всё работает как ожидалось, если я делаю обновление из консоли Rails. Я могу установить его в nil или не nil, и соответствующая часть страницы появляется или исчезает, как и должно быть. Когда я запускаю свою задачу Ansible из терминала, Ansible отправляет новое значение через маршрут, что обновляет запись, которая, в свою очередь, отправляет данные в MessageBus, и секция шаблона отображается как ожидалось.

Однако, если Ansible запускается задачей Discourse, я всё ещё вижу, что Rails заявляет об отправке данных в MessageBus. В консоли браузера (JavaScript) я вижу, что срабатывает вычисляемая функция, отслеживающая это значение, но значение равно null. Если я перезагрузить браузер, данные появляются, и страница отображается корректно. Возможно, это какая-то особенность среды разработки, и на продакшене всё будет иначе.

Возможно, это связано с этим?

Что ж, я всё ещё беспокоюсь об этой ошибке, но я добавил

         window.location.reload(true);

в своё действие, страница перезагружается, и после этого всё, кажется, работает.