È possibile serializzare un controller?

Ciao community di Discourse. Non ho trovato un argomento simile, quindi ho pensato di iniziarne uno.

Sto usando un plugin per estendere la funzionalità di Discourse per scopi della mia organizzazione. Una di queste è il rendering di un JSON da email/unsubscribe/{KEY}, poiché vorremmo controllare queste opzioni da un server diverso da quello su cui eseguiamo la nostra istanza Discourse. Tale endpoint è sotto la responsabilità dell’EmailController e, per impostazione predefinita, EmailControllerHelper imposta variabili di istanza per il controller prima di renderizzare una vista. Invece, vorrei restituire l’EmailController come JSON.

Quindi la mia domanda di base è: è possibile serializzare un controller? Cioè, posso definire un serializzatore per il controller come questo:

  class ::EmailController
    # IL FILE CHE QUESTO MODIFICA: app/controllers/email_controller.rb
    # Restituisce 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

o è meglio che lo forzi manualmente?

  class ::EmailController
    # IL FILE CHE QUESTO MODIFICA: app/controllers/email_controller.rb
    # Restituisce un json

    module ReturnAsJSON
      def unsubscribe
        super

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

    prepend ReturnAsJSON
  end

Il secondo approccio sembra funzionare, quindi se il primo approccio non funziona almeno ho una buona soluzione alternativa.

Cerca plugin esistenti o sorgenti di discourse per add_to_serializer.

1 Mi Piace

Grazie @pfaffman, ma non credo che sia quello che sto cercando. Ho provato quella strada per un po’ (e in realtà la uso altrove nel nostro plugin personalizzato), ma non so se aiuterà qui. Per quanto ne so, NESSUN controller nel repository di Discourse è serializzato. Non sto cercando di AGGIUNGERE a un serializer esistente, sto cercando di CREARNE uno nuovo.

1 Mi Piace

Ah. Devi quindi aggiungere un modello Rails e poi anche un modello a Ember. L’ho fatto diverse volte e lo trovo ancora molto confuso.

Dai un’occhiata a un altro plugin che aggiunge una route. Subscriptions è uno, ma potresti anche ottenere GitHub - discourse/all-the-plugins e poi cercare “route*”. La parte Rails è in config e la parte Ember è in assets/javascripts/discourse/routes.

1 Mi Piace

Ottimo, grazie. Potrei riuscire a farne a meno di usare Ember, dato che i nostri utenti non devono vedere affatto il frontend di Discourse.

L’ho fatto diverse volte e lo trovo ancora molto confuso.

Questo è un certo conforto. Forse opterò per la mia seconda strada sopra e valuterò se è necessario un nuovo endpoint qui. Grazie!

Questo rende le cose molto più facili (per me, in particolare). Quindi, dopo aver aggiunto il route, recuperi /your-new-route.json e questo dovrebbe fare al caso tuo, e poi puoi evitare gli altri 3-5 file (o sono 500?) che devi creare in Ember.

Quindi aggiungi il route e poi aggiungi il controller e il model. Penso che siano solo questi 3 file che devi creare.

1 Mi Piace