Weiterleitung zur Seite nach dem Kauf

Ich habe add_model_callback(DiscourseSubscriptions::Customer, :after_save) do ... in einem Plugin. Die meisten Käufe führen zur Erstellung eines „Servers“ (ein benutzerdefiniertes Modell). Heute habe ich gelernt, wie ich andere Stellen, an denen ein Server erstellt wird, zur Seite zur Konfiguration des neuen Servers weiterleiten kann, mit etwas wie

      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}`);
        }

Was ich jetzt tun möchte, ist, dass Discourse nach dem Schließen des Dialogs „Danke für Ihren Kauf“ auf ähnliche Weise zu dieser neuen Seite weiterleitet.

Es ist mir egal, ob es in Rails oder Ember passiert, aber ich schätze, es muss in Ember passieren? Ich verstehe nicht ganz (das heißt, ich habe absolut keine Ahnung), wie ich den Controller/das Modell/was auch immer im Abonnement-Plugin von meinem Plugin aus „kapern“ kann kann.

2 „Gefällt mir“

Es gibt wahrscheinlich eine Aktion closeModal (vielleicht in der Route).

Darin könnten Sie DiscourseURL.routeTo(\"/yourdiscourseroute\"); ausführen.

1 „Gefällt mir“

Nun, nicht ganz. Aber es war wie durch ein Wunder genug! Ich habe das hier gefunden:

Und dann habe ich das hier gemacht!!

      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}`);
            }
          });
        },
      });

Was so sehr, sehr nah dran ist. Das Problem ist jetzt, dass es eine Race Condition gibt, da der add_model_callback(DiscourseSubscriptions::Customer, :after_save) do möglicherweise nicht abgeschlossen ist, bevor ich meine Ajax-Abfrage ausführe, um die Server zu erhalten.

Nun, es ist seltsamer als das. Selbst wenn ich eine Verzögerung hinzufüge (mit later), bevor die Ajax-Abfrage ausgeführt wird, um die neue Serverliste zu erhalten, erhält sie immer noch eine veraltete Liste, nicht die, nachdem der neue Server im Callback hinzugefügt wurde. Ich kann das Fenster in einem anderen Tab aktualisieren und sehen, dass es die richtigen Daten erhält, bevor es die Ajax-Abfrage ausführt.

Ich werde es jetzt wohl aufgeben. Für den Fall, dass der Server vor dem Kauf existiert (was meiner Meinung nach häufiger vorkommt - man würde alles konfigurieren und dann sagen: „Ja, machen wir das“), funktioniert es; es ist nur der Fall, dass sie sagen: „Ja, ich möchte für eine Installation bezahlen; ich bezahle und sehe dann, was passiert.“