É possível serializar um controller?

Olá comunidade Discourse. Não encontrei um tópico semelhante, então pensei em iniciar um.

Estou usando um plugin para estender a funcionalidade do Discourse para os propósitos da minha organização. Uma dessas funcionalidades é renderizar um JSON de email/unsubscribe/{KEY}, pois gostaríamos de controlar essas opções de um servidor diferente daquele em que executamos nossa instância do Discourse. Esse endpoint está sob a alçada do EmailController, e por padrão o EmailControllerHelper define variáveis de instância para o controller antes de renderizar uma view. Em vez disso, eu gostaria de retornar o EmailController como um JSON.

Portanto, minha pergunta fundamental é: é possível serializar um controller? Ou seja, posso definir um serializador para o controller como este:

  class ::EmailController
    # O ARQUIVO QUE ESTE MODIFICA: app/controllers/email_controller.rb
    # Retorna um 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 é melhor eu forçar isso?

  class ::EmailController
    # O ARQUIVO QUE ESTE MODIFICA: app/controllers/email_controller.rb
    # Retorna um json

    module ReturnAsJSON
      def unsubscribe
        super

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

    prepend ReturnAsJSON
  end

A 2ª abordagem parece funcionar, então se a 1ª abordagem não funcionar, pelo menos terei uma solução alternativa decente.

Pesquise plugins existentes ou o código-fonte do Discourse por add_to_serializer.

1 curtida

Obrigado @pfaffman, mas acho que não é o que estou procurando. Tentei essa rota por um tempo (e na verdade a uso em outro lugar em nosso plugin personalizado), mas não sei se ajudará aqui. Pelo que pude apurar, NENHUM controlador no repositório Discourse é serializado. Não estou tentando ADICIONAR a um serializador existente, estou tentando CRIAR um novo.

1 curtida

Ah. Então você precisa adicionar um modelo Rails e, em seguida, também adicionar um modelo ao Ember. Eu já fiz isso várias vezes e ainda acho muito confuso.

Confira outro plugin que adiciona uma rota. Subscriptions é um, mas você também pode obter GitHub - discourse/all-the-plugins e, em seguida, procurar por “route*”. A parte Rails está em config e a parte Ember está em assets/javascripts/discourse/routes.

1 curtida

Ótimo, obrigado. Talvez eu consiga me safar sem usar o Ember, já que nossos usuários não devem ver o frontend do Discourse de forma alguma.

Eu fiz isso várias vezes e ainda acho muito confuso.

Isso é algum consolo. Talvez eu opte pela minha segunda rota acima e avalie se um novo endpoint é necessário aqui. Obrigado!

Isso facilita muito (para mim, especialmente). Então, depois de adicionar a rota, você acessa /sua-nova-rota.json e isso deve resolver o problema, e então você pode evitar os outros 3-5 arquivos (ou são 500?) que você tem que criar no Ember.

Então você adiciona a rota e depois adiciona o controller e o model. Acho que são apenas esses 3 arquivos que você tem que criar.

1 curtida