Salut la communauté Discourse. Je n’ai pas trouvé de sujet similaire, alors j’ai pensé en créer un.
J’utilise un plugin pour étendre les fonctionnalités de Discourse aux besoins de mon organisation. L’une de ces extensions consiste à rendre un JSON à partir de email/unsubscribe/{KEY}, car nous aimerions contrôler ces options à partir d’un serveur différent de celui sur lequel nous exécutons notre instance Discourse. Ce point de terminaison relève de la responsabilité de l’EmailController, et par défaut, l’EmailControllerHelper définit des variables d’instance pour le contrôleur avant de rendre une vue. Au lieu de cela, j’aimerais que l’EmailController retourne un JSON.
Ma question fondamentale est donc : est-il possible de sérialiser un contrôleur ? C’est-à-dire, puis-je définir un sérialiseur pour le contrôleur comme ceci :
class ::EmailController
# LE FICHIER QUE CECI MODIFIE : app/controllers/email_controller.rb
# Retourner un 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
ou vaut-il mieux que je force les choses ?
class ::EmailController
# LE FICHIER QUE CECI MODIFIE : app/controllers/email_controller.rb
# Retourner un json
module ReturnAsJSON
def unsubscribe
super
render json: {type: @type, unsubscribed_from_all: @unsubscribed_from_all, etc.}
end
end
prepend ReturnAsJSON
end
La 2ème approche semble fonctionner, donc si la 1ère approche ne fonctionne pas, j’ai au moins une solution de contournement décente.