Переопределение сериализатора


Настройка сериализаторов по умолчанию

При использовании Active Model Serializer в бэкенде Rails, чтобы переопределить сериализатор по умолчанию, необходимо создать новый сериализатор.

Имея модель User и модель Recipe, мы можем выбрать информацию, которая будет отображаться, чтобы упростить вывод JSON.

# Serializer for User
class UserSerializer < ActiveModel::Serializer
  attributes :id, :username
  has_many :recipes
end

# Serializer for Recipe
class RecipeSerializer < ActiveModel::Serializer
  attributes :id, :name, :ingredients, :instructions
  belongs_to :user
end

Вход в полноэкранный режим Выход из полноэкранного режима

пользователи#индекс

На users#index вывод будет показывать идентификатор пользователя и имя пользователя вместе со всеми атрибутами каждого рецепта, созданного пользователем. В данном случае будут показаны идентификатор рецепта, название, ингредиенты и инструкции.

Чтобы изменить вывод для удобства чтения, мы добавим несколько вещей.

# User serializer
class UserSerializer < ActiveModel::Serializer
  attributes :id, :username
  has_many :recipes, serializer: UserRecipeSerializer
end

# UserRecipeSerializer
class UserRecipeSerializer < ActiveModel::Serializer
  attributes :id, :name
end
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь будут отображаться только те атрибуты из Recipe, которые указал UserRecipeSerializer.

Недостатком является то, что при user#show также будет использоваться этот сериализатор и не будет показана полная информация о рецепте(ах), если это было необходимо.

пользователи#показать

На маршруте users#show действие контроллера будет иметь дополнительный бит к еще одному сериализатору только для того, чтобы показать полную информацию о рецепте.

# UsersController
...

def show
  user = User.find_by_id(params[:id])
  if user
    # BEFORE SERIALIZER
    # render json: user

    #  AFTER SERIALIZER
    render json: { user: UserShowSerializer.new(user)}
  end
end

# UserShowSerializer 
class UserShowSerializer < ActiveModel::Serializer
  attributes :id, :username
  has_many :recipes
end
Вход в полноэкранный режим Выход из полноэкранного режима

Самым безопасным способом показать правильный сериализатор будет добавление метода .new для каждого вызова рендеринга (не обязательно) в действие контроллера, чтобы гарантировать отображение необходимой информации

Оцените статью
Procodings.ru
Добавить комментарий