Может ActiveModel::сериализатор есть с пространством имен (вложенные) как регуляторов рельсы?


Вопрос:

Я делаю это с моим контроллером:

class Api::Product::V1::LicenseController < ApplicationController

Почему я не могу сделать это с моим сериализатором? (или я могу?)

class Api::Product::V1::LicenseSerializer < ActiveModel::Serializer

Контекст:

У меня есть несколько контроллеров / маршрутов, которые соответствуют одной модели.

И мне нужно иметь несколько сериализаторов на модель, которые соответствуют 1-к-1 с моими контроллерами.

ActiveModel::Serializers позволяет задать сериализатор из контроллера, например:

render :json => @license_token, :serializer => LicenseSerializer
Так почему же я не могу сделать то же самое?
render :json => @license_token, :serializer => Api::Product::V1::LicenseSerializer

Я есть пытаясь избежать уродства составных имен, подобных этим, хотя я знаю, что они будут работать:

  • ProductAlphaLicenseSerializer
  • ProductBravoLicenseSerializer
  • ProductCharlieLicenseSerializer

Каждая из моих моделей поддерживает несколько API, поэтому я хочу использовать пространство имен сериализаторов. Каждая модель используется по-разному каждым соответствующим сериализатором.

1 4

1 ответ:

Это может помочь, если вы объясните ошибку (если таковая имеется), которую вы получаете. У меня была аналогичная озабоченность в отношении активных сериализаторов моделей, и в соответствии с документацией AMS будет выполнять только автоматический поиск сериализатора в пути app/serializers на основе класса модели, поэтому контроллеры пространства имен не имеют отношения к поиску сериализатора.

Кажется, нет ничего, что мешает вам указать любой класс сериализатора, который вы хотите вручную, фактически из вашего пространства имен контроллер, использующий LicenseSerializer, должен по умолчанию искать класс пространства имен в модуле Api::Product::V1. Вы пробовали организовать свои сериализаторы под соответствующим пространством имен, чтобы загрузка класса rails разрешала их автоматически? например, положить Api::Product::V1::LicenceSerializer в app/serializers/api/product/v1/license_serializer.rb ?

Вы можете также хотеть смотреть на рев-рельсы камень, которая интегрируется с рельсов и использует Руби веб-платформы агностик рев драгоценный камень, который поддерживает два пути в JSON/XML и формат JSON+Хэл обработки, используя представителем образец. Быть зная, что вы не получите jbuilder/jsonify, как контроль над сериализацией, но если вы смотрите на AMS, я предполагаю, что вы хотите быть несколько повышены от деталей. Используя ROAR, вы получите единый API, основанный на выбранном вами формате представления, и будете намного ближе к настоящему API гипермедиа.

Некоторые из обоснований подхода representer/ROAR здесь, здесь и здесь.

EDIT : возможно, вы также захотите рассмотреть мой to_json реализация. Производительность и гибкость со всеми текущими библиотеками сериализаторов JSON были существенной проблемой в моем проекте. После экспериментов со всеми альтернативами я закончил разработку чистого DSL JSON и сотрудничал с автором Oj для разработки высокоэффективного API для маршалинга строк/потоков. My to_json gem легко сериализует 18 000 сложных объектов в секунду на бюджетных хостинговых серверах и не имеет ограничений на JSON структуры, которые могут быть созданы.