購入後のページへのリダイレクト

プラグインに 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 呼び出しを実行する前に正しいデータを取得していることがわかります。

今は諦めることにします。サーバーが購入前に存在する場合(おそらくより一般的だと思います。すべてを設定してから「はい、やりましょう」と言うでしょう)、それは機能します。問題は、「はい、インストールに支払いたい。支払ってからどうなるか見てみよう」と言う場合です。