购买后重定向到页面

我在插件中有一个 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 插件的控制器/模型/其他组件。

2 个赞

可能有一个名为 closeModal 的操作(可能在路由中)。

在其中,您可以执行 DiscourseURL.routeTo(\"/yourdiscourseroute\");

1 个赞

嗯,不完全是。但是,奇迹般地,这就够了!我找到了这个:

然后我做了这个!!

      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 调用之前获取了正确的数据。

我想我现在要放弃了。对于服务器在购买前就存在的情况(我认为这更常见——你会配置好一切,然后说,“是的,我们开始吧”),它是有效的;只有当他们说“是的,我想支付安装费用;我将支付,然后看看会发生什么”的情况才行。