Kann man einen Controller serialisieren?

Hallo Discourse-Community. Ich habe kein ähnliches Thema gefunden, also dachte ich, ich eröffne eines.

Ich verwende ein Plugin, um die Funktionalität von Discourse für die Zwecke meiner Organisation zu erweitern. Eine davon ist das Rendern eines JSON von email/unsubscribe/{KEY}, da wir diese Optionen von einem anderen Server als dem, auf dem wir unsere Discourse-Instanz betreiben, steuern möchten. Dieser Endpunkt liegt im Zuständigkeitsbereich des EmailController, und standardmäßig setzt der EmailControllerHelper Instanzvariablen für den Controller, bevor eine Ansicht gerendert wird. Stattdessen möchte ich den EmailController als JSON zurückgeben.

Meine grundlegende Frage ist also: Ist es möglich, einen Controller zu serialisieren? D. h. kann ich einen Serializer für den Controller wie folgt definieren:

  class ::EmailController
    # DIE DATEI, DIE DIESE MODIFIZIERT: app/controllers/email_controller.rb
    # Gibt ein JSON zurück

    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

oder ist es besser, dies mit Gewalt zu erzwingen?

  class ::EmailController
    # DIE DATEI, DIE DIESE MODIFIZIERT: app/controllers/email_controller.rb
    # Gibt ein JSON zurück

    module ReturnAsJSON
      def unsubscribe
        super

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

    prepend ReturnAsJSON
  end

Der 2. Ansatz scheint zu funktionieren, also wenn der 1. Ansatz nicht funktioniert, habe ich zumindest einen anständigen Workaround.

Suche nach vorhandenen Plugins oder Discourse-Quellen für add_to_serializer.

1 „Gefällt mir“

Danke @pfaffman, aber ich glaube nicht, dass das das ist, wonach ich suche. Ich habe diesen Weg eine Weile ausprobiert (und benutze ihn tatsächlich auch anderswo in unserem benutzerdefinierten Plugin), aber ich weiß nicht, ob er hier helfen wird. Soweit ich das beurteilen kann, ist KEIN Controller im Discourse-Repository serialisiert. Ich versuche nicht, zu einem bestehenden Serializer hinzuzufügen, ich versuche, einen neuen zu erstellen.

1 „Gefällt mir“

Ah. Dann müssen Sie ein Rails-Modell hinzufügen und dann auch ein Modell zu Ember hinzufügen. Ich habe es mehrmals gemacht und finde es immer noch sehr verwirrend.

Schauen Sie sich ein weiteres Plugin an, das eine Route hinzufügt. Subscriptions ist eines, aber Sie können auch GitHub - discourse/all-the-plugins herunterladen und dann nach „route*“ suchen. Der Rails-Teil befindet sich in config und der Ember-Teil in assets/javascripts/discourse/routes.

1 „Gefällt mir“

Großartig, danke. Ich könnte vielleicht ohne Ember auskommen, da unsere Benutzer das Discourse-Frontend überhaupt nicht sehen sollen.

Ich habe es mehrmals getan und finde es immer noch sehr verwirrend.

Das ist ein kleiner Trost. Ich werde vielleicht meine zweite oben genannte Route wählen und prüfen, ob hier ein neuer Endpunkt benötigt wird. Danke!

Das macht es viel einfacher (besonders für mich). Nachdem Sie die Route hinzugefügt haben, rufen Sie /your-new-route.json auf, und das sollte den Trick tun, und dann können Sie die anderen 3-5 Dateien (oder sind es 500?) vermeiden, die Sie in Ember erstellen müssen.

Sie fügen also die Route und dann den Controller und das Model hinzu. Ich glaube, es sind nur diese 3 Dateien, die Sie erstellen müssen.

1 „Gefällt mir“