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