Можно ли сериализовать контроллер?

Привет, сообщество Discourse. Я не нашёл похожей темы, поэтому решил создать свою.

Я использую плагин для расширения функциональности Discourse в интересах моей организации. Одна из задач — рендеринг JSON по пути email/unsubscribe/{KEY}, так как мы хотим управлять этими опциями с другого сервера, отличного от того, на котором запущен наш экземпляр Discourse. Эта конечная точка находится в ведении EmailController, и по умолчанию EmailControllerHelper устанавливает переменные экземпляра для контроллера перед рендерингом представления. Вместо этого я хотел бы возвращать EmailController в формате JSON.

Так что мой основной вопрос: возможно ли сериализовать контроллер? То есть, могу ли я определить сериализатор для контроллера вот так:

  class ::EmailController
    # ФАЙЛ, КОТОРЫЙ МОДИФИЦИРУЕТСЯ: app/controllers/email_controller.rb
    # Возврат 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

или мне лучше прибегнуть к грубой силе?

  class ::EmailController
    # ФАЙЛ, КОТОРЫЙ МОДИФИЦИРУЕТСЯ: app/controllers/email_controller.rb
    # Возврат JSON

    module ReturnAsJSON
      def unsubscribe
        super

        render json: {type: @type, unsubscribed_from_all: @unsubscribed_from_all, и т.д.}
      end
    end

    prepend ReturnAsJSON
  end

Второй подход, похоже, работает, так что если первый не сработает, у меня как минимум будет хорошее решение-обходной путь.

Поиск существующих плагинов или исходного кода Discourse по add_to_serializer.

Спасибо, @pfaffman, но, кажется, это не то, что мне нужно. Я пробовал этот подход какое-то время (и даже использую его в другом месте нашего кастомного плагина), но не уверен, поможет ли это здесь. Насколько я понимаю, ни один контроллер в репозитории Discourse не сериализуется. Я не пытаюсь добавить что-то к существующему сериализатору, я пытаюсь создать новый.

Ага. Тогда вам нужно добавить модель Rails, а затем также добавить модель в Ember. Я делал это несколько раз и всё ещё считаю это очень запутанным.

Посмотрите на другой плагин, который добавляет маршрут. Subscriptions — один из них, но вы также можете получить GitHub - discourse/all-the-plugins · GitHub, а затем выполнить поиск по “route*”. Часть Rails находится в config, а часть Ember — в assets/javascripts/discourse/routes.

Отлично, спасибо. Возможно, мне удастся обойтись без Ember, так как пользователи вообще не должны видеть фронтенд Discourse.

Я делал это несколько раз, и всё ещё считаю это очень запутанным.

Это хоть какое-то утешение. Возможно, я выберу второй вариант из перечисленных выше и оценю, нужен ли здесь новый endpoint. Спасибо!

Это значительно упрощает задачу (особенно для меня). Так что после добавления маршрута вы обращаетесь к /your-new-route.json, и этого должно быть достаточно. Тогда вам не придётся создавать остальные 3–5 файлов (или их 500?), которые обычно требуются в Ember.

Итак, вы добавляете маршрут, затем контроллер и модель. Кажется, нужно создать только эти три файла.