Может 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 ответ:
Это может помочь, если вы объясните ошибку (если таковая имеется), которую вы получаете. У меня была аналогичная озабоченность в отношении активных сериализаторов моделей, и в соответствии с документацией 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 структуры, которые могут быть созданы.