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.