Сериализаторы в Ruby

Поговорим о сериализаторах в Ruby. Большинство людей создают прекрасные приложения на Ruby без использования сериализаторов. Это определенно одна из тех вещей, без которых вы можете обойтись, пока она вам действительно не понадобится! В этом блоге мы поговорим о том, как создавать сериализаторы и управлять ими.

Введение в ActiveModel :: Serializer

Так что же такое ActiveModel :: Serializer? Что ж, ActiveModel :: Serializer предоставляет способ создания пользовательской нотации объектов JavaScript, также известной как JSON. Ему удается сделать это, представляя каждый ресурс как класс, унаследованный от ActiveModel :: Serializer. Это очень полезно, если вы хотите создать JSON API с помощью объектов сериализатора, поскольку это позволяет полностью настроить вывод JSON. Таким образом, мы можем выбрать только ту информацию, которая нам нужна, а также получить доступ к нашим отношениям (ООП).

Установка

Чтобы установить ActiveModel :: Serializer, добавьте следующий гем в свой

Gemfile:

gem 'active_model_serializers', '0.9.3'

После добавления драгоценного камня вы можете установить его с помощью пакета:

bundle install

После завершения установки, чтобы сгенерировать сериализатор, вы должны решить, для какой модели генерировать сериализатор.

rails g serializer product

Например, приведенное выше создаст сериализатор для модели Product. После создания сериализатора он будет отображаться как app / serializers / product_serializer.rb со следующим содержанием:

# app/serializers/product_serializer.rb

Допустим, у нашей модели продукта были все эти атрибуты:

class Product < ApplicationRecord  
  has_many :reviews  
  has_many :users, through: :reviews   
  validates :title, presence: true  
  validates :description, presence: true      
  validates :category, presence: true  
  validates :price, presence: true    
  validates :lightURL, presence: true  
  validates :medURL, presence: true   
  validates :darkURL, presence: true  
  validates :vidURL, presence: true
end

Но если нам не нужно, чтобы вся эта информация отображалась из нашего ProductSerializer, то, что мы можем сделать, - это после того, как сериализатор продукта будет сгенерирован, и мы сможем выбрать, какие атрибуты мы хотим, чтобы наш JSON API содержал.

class ProductSerializer < ActiveModel::Serializer  
  attributes :id, :title, :description, :category, :price
end  

Итак, теперь, когда мы загружаем http: // localhost: 3000 / api / v1 / products, мы должны увидеть наш API, состоящий из пользовательских данных, которые мы хотели отобразить, разрешив их в нашем сериализаторе.

 http://localhost:3000/api/v1/products
[
  {
    "id": 16,
    "title": "Plum",
    "description": "Size: 3 g / 0.1 US oz",
    "category": "Lipstick",
    "price": "$18.50"
  },
  {
    "id": 17,
    "title": "Red",
    "description": "Size: 3 g / 0.1 US oz",
    "category": "Lipstick",
    "price": "$18.50"
  },
  {
    "id": 18,
    "title": "Pink",
    "description": "Size: 3 g / 0.1 US oz",
    "category": "Lipstick",
    "price": "$18.50"
  },
  {
    "id": 19,
    "title": "Nude",
    "description": "Size: 3 g / 0.1 US oz",
    "category": "Lipstick",
    "price": "$18.50",
    "imgURL": "/image
  },
  {
    "id": 20,
    "title": "Coral",
    "description": "Size: 3 g / 0.1 US oz",
    "category": "Lipstick",
    "price": "$18.50"
  }
]

Как видите, в моем ProductSerializer я смог опустить атрибуты, которые мне не нужно было отображать, и вместо этого добавил только те, которые мне нужны, и отформатировал их в JSON. Таким образом, AMS (ActiveModel :: Serializer) - это мощный способ составить API с явными, простыми в обслуживании сериализаторами, в отличие от отслеживания того, что вы делаете и не хотите отображать на контроллере или уровень просмотра.