Peut-on sérialiser un contrôleur ?

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.

Rechercher dans les plugins existants ou la source de discourse pour add_to_serializer.

1 « J'aime »

Merci @pfaffman, mais je ne pense pas que ce soit ce que je recherche. J’ai essayé cette voie pendant un certain temps (et je l’utilise d’ailleurs dans notre plugin personnalisé), mais je ne sais pas si cela aidera ici. Pour autant que je sache, AUCUN contrôleur dans le dépôt Discourse n’est sérialisé. Je n’essaie pas d’AJOUTER à un sérialiseur existant, j’essaie d’EN CRÉER un nouveau.

1 « J'aime »

Ah. Vous devez ensuite ajouter un modèle Rails, puis également ajouter un modèle à Ember. Je l’ai fait plusieurs fois et je trouve toujours cela très déroutant.

Consultez un autre plugin qui ajoute une route. Subscriptions en est un, mais vous pourriez également obtenir GitHub - discourse/all-the-plugins et ensuite rechercher “route*”. La partie Rails se trouve dans config et la partie Ember se trouve dans assets/javascripts/discourse/routes.

1 « J'aime »

Super, merci. Je pourrais peut-être m’en sortir sans utiliser Ember, car nos utilisateurs ne sont pas censés voir le frontend de Discourse du tout.

Je l’ai fait plusieurs fois et je trouve toujours cela très déroutant.

C’est un certain réconfort. Je vais peut-être opter pour ma 2ème solution ci-dessus et évaluer si un nouveau point de terminaison est nécessaire ici. Merci !

Cela me facilite beaucoup les choses (surtout pour moi). Donc, après avoir ajouté la route, vous récupérez /your-new-route.json et cela devrait faire l’affaire, puis vous pouvez éviter les 3 à 5 autres fichiers (ou est-ce 500 ?) que vous devez créer dans Ember.

Donc, vous ajoutez la route, puis le contrôleur et le modèle. Je pense que ce sont juste ces 3 fichiers que vous devez créer.

1 « J'aime »