コントローラーをシリアライズできますか?

Discourse コミュニティの皆様。類似のトピックが見つからなかったので、新しいトピックを立てることにしました。

組織の目的のために Discourse の機能を拡張するプラグインを使用しています。その機能の 1 つは、email/unsubscribe/{KEY} から JSON をレンダリングすることです。これは、Discourse インスタンスを実行しているサーバーとは別のサーバーからこれらのオプションを制御したいと考えているためです。このエンドポイントは EmailController の管轄下にあり、デフォルトでは EmailControllerHelper がビューをレンダリングする前にコントローラーのインスタンス変数を設定します。代わりに、EmailController を JSON として返したいと考えています。

したがって、根本的な質問は、コントローラーをシリアル化することは可能かということです。つまり、次のようなコントローラーのシリアライザーを定義できますか。

  class ::EmailController
    # このファイルが変更されます: app/controllers/email_controller.rb
    # JSON を返す

    module ReturnAsJSON
      def unsubscribe
        super

        render EmailUnsubscribeSerializer.new(self, root: false).to_json
      end
    end

    prepend ReturnAsJSON
  end

  class EmailUnsubscribeSerializer < ApplicationSerializer
    attributes :topic, :type, :unsubscribed_from_all, :user

    def user
      BasicUserSerializer.new(object.user, root: false).as_json
    end
  end

それとも、力任せに解決する方が良いでしょうか?

  class ::EmailController
    # このファイルが変更されます: app/controllers/email_controller.rb
    # JSON を返す

    module ReturnAsJSON
      def unsubscribe
        super

        render json: {type: @type, unsubscribed_from_all: @unsubscribed_from_all, etc.}
      end
    end

    prepend ReturnAsJSON
  end

2 番目のアプローチは機能するように見えるので、最初のアプローチが機能しない場合でも、まともな回避策があります。

add_to_serializer を検索するには、既存のプラグインまたは Discourse ソースを検索してください。

「いいね!」 1

@pfaffman さん、ありがとうございます。ですが、お探しのものとは違うと思います。その方法はしばらく試しました(そして、実際にカスタムプラグインの他の場所でも使用しています)が、ここで役立つかどうかは分かりません。私の知る限り、Discourse リポジトリのコントローラーはどれもシリアライズされていません。既存のシリアライザーに追加しようとしているのではなく、新しいシリアライザーを作成しようとしています。

「いいね!」 1

ああ。それならRailsモデルを追加してから、Emberにもモデルを追加する必要があります。何度もやってきましたが、まだ非常に混乱しています。

ルートを追加する他のプラグインをチェックしてみてください。Subscriptions がその一つですが、GitHub - discourse/all-the-plugins を取得して「route*」で検索することもできます。Rails部分は config にあり、Ember部分は assets/javascripts/discourse/routes にあります。

「いいね!」 1

素晴らしい、ありがとうございます。ユーザーは Discourse フロントエンドをまったく表示しないことになっているので、Ember を使用せずに済むかもしれません。

何度か行いましたが、まだ非常に混乱しています。

これはいくらか安心できます。おそらく 2 番目の方法を選択し、ここで新しいエンドポイントが必要かどうかを評価します。ありがとうございます!

それは(特に私にとって)ずっと楽になります。ルートを追加した後、/your-new-route.json をプルすれば、それがうまくいくはずです。そうすれば、Emberで作成しなければならない他の3〜5ファイル(あるいは500ファイル?)を避けることができます。

ルートを追加してから、コントローラーとモデルを追加します。作成しなければならないファイルは、その3つだけだと思います。

「いいね!」 1