Перенаправление на страницу после покупки

В плагине у меня есть add_model_callback(DiscourseSubscriptions::Customer, :after_save) do .... Большинство покупок приводит к созданию «сервера» (пользовательская модель). Сегодня я узнал, как сделать так, чтобы в других местах, где создаётся сервер, переход на страницу настройки нового сервера происходил примерно так:

      Server.createServer(server).then((result) => {
        if (result.server) {
          this.get("servers").pushObject(EmberObject.create(result.server));
          const id = result.server.id;
          window.location = getURL(`/pfaffmanager/servers/${id}`);
        }

Теперь я хотел бы сделать так, чтобы Discourse аналогично перенаправлял на эту новую страницу после того, как диалоговое окно «Спасибо за покупку» будет закрыто.

Мне не важно, произойдёт ли это в Rails или в Ember, но, полагаю, это должно происходить в Ember? Я не до конца понимаю (то есть у меня вообще нет ни малейшего представления), как захватить расширить контроллер/модель/что угодно в плагине subscriptions из своего плагина.

Вероятно, существует действие closeModal (возможно, в маршруте).

В рамках этого действия вы можете выполнить DiscourseURL.routeTo("/yourdiscourseroute");

Ну, не совсем. Но, чудо из чудес, этого хватило! Я нашел это:

А затем сделал вот что!!

      api.modifyClass("controller:subscribe-show", {
        pluginId: "pfaffmanager",
        async _advanceSuccessfulTransaction(plan) {
          window.console.log("modifying subscription!!!", plan, this);
          this.alert("plans.success");
          this.set("loading", false);
          let servers = [];
          servers = await Server.listServers().then((result) => {
            if (currentUser && currentUser.servers !== undefined) {
              servers = currentUser.servers.sort((b, a) => {
                return ("" + a.updated_at).localeCompare(b.updated_at);
              });
              window.console.log("sorted servers", servers);
              if (servers.length > 0) {
                window.console.log(`going to first! ${servers[0].id}`);
                this.transitionToRoute(
                  "pfaffmanager.servers.show",
                  servers[0].id
                );
              } else {
                window.console.log(`server not found. going to index!`);
                this.transitionToRoute("pfaffmanager.servers.index");
              }
              // window.location = getURL(`/`);
              // window.location = getURL(`/pfaffmanager/servers/${id}`);
            }
          });
        },
      });

Это уже очень-очень близко. Проблема теперь в том, что возникает состояние гонки, так как add_model_callback(DiscourseSubscriptions::Customer, :after_save) do может не завершиться до того, как я выполню свой AJAX-запрос для получения списка серверов.

На самом деле, всё ещё страннее. Даже если я добавлю задержку (используя later) перед AJAX-запросом для получения нового списка серверов, всё равно возвращается устаревший список, а не тот, который должен быть после добавления нового сервера в обратном вызове. Я могу обновить окно в другой вкладке и увидеть, что там данные верные ещё до выполнения AJAX-запроса.

Думаю, пока я сдамся. Для случая, когда сервер существует до покупки (что, я думаю, более распространено — вы всё настроите, а потом скажете: «Да, давайте сделаем это»), всё работает; проблема только в случае, когда пользователь говорит: «Да, я хочу оплатить установку; я заплачу, а потом посмотрю, что получится».