¿Se puede serializar un controlador?

Hola comunidad de Discourse. No encontré un tema similar, así que pensé en iniciar uno.

Estoy usando un plugin para extender la funcionalidad de Discourse para los propósitos de mi organización. Una de estas es renderizar un JSON desde email/unsubscribe/{KEY}, ya que nos gustaría controlar estas opciones desde un servidor diferente al que ejecutamos nuestra instancia de Discourse. Ese endpoint está bajo la supervisión del EmailController, y por defecto el EmailControllerHelper establece variables de instancia para el controlador antes de renderizar una vista. En cambio, me gustaría devolver el EmailController como un JSON.

Entonces, mi pregunta fundamental es, ¿es posible serializar un controlador? Es decir, ¿puedo definir un serializador para el controlador como este?

  class ::EmailController
    # EL ARCHIVO QUE ESTO MODIFICA: app/controllers/email_controller.rb
    # Devolver 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 es mejor que lo fuerce?

  class ::EmailController
    # EL ARCHIVO QUE ESTO MODIFICA: app/controllers/email_controller.rb
    # Devolver un json

    module ReturnAsJSON
      def unsubscribe
        super

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

    prepend ReturnAsJSON
  end

El segundo enfoque parece funcionar, así que si el primer enfoque no lo hace, al menos tengo una solución alternativa decente.

Busca plugins existentes o el código fuente de Discourse en busca de add_to_serializer.

1 me gusta

Gracias @pfaffman, pero no creo que sea lo que estoy buscando. Probé esa ruta por un tiempo (y de hecho la uso en otro lugar de nuestro plugin personalizado), pero no sé si ayudará aquí. Hasta donde puedo ver, NINGÚN controlador en el repositorio de Discourse está serializado. No estoy tratando de AGREGAR a un serializador existente, estoy tratando de CREAR uno nuevo.

1 me gusta

Ah. Entonces necesitas agregar un modelo de Rails y luego también agregar un modelo a Ember. Lo he hecho varias veces y todavía me parece muy confuso.

Echa un vistazo a otro plugin que agrega una ruta. Suscripciones es uno, pero también puedes obtener GitHub - discourse/all-the-plugins y luego buscar “route*”. La parte de Rails está en config y la parte de Ember está en assets/javascripts/discourse/routes.

1 me gusta

Genial, gracias. Podría arreglármelas sin usar Ember, ya que nuestros usuarios no deben ver la interfaz de Discourse en absoluto.

Lo he hecho varias veces y sigo encontrándolo muy confuso.

Esto es un consuelo. Quizás opte por mi segunda ruta anterior y evalúe si se necesita un nuevo endpoint aquí. ¡Gracias!

Eso lo hace mucho más fácil (para mí, especialmente). Así que después de agregar la ruta, busca /your-new-route.json y eso debería funcionar, y luego puedes evitar los otros 3-5 archivos (¿o son 500?) que tienes que crear en Ember.

Así que agregas la ruta y luego agregas el controlador y el modelo. Creo que solo son esos 3 archivos los que tienes que crear.

1 me gusta