Сериализаторы в 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 с явными, простыми в обслуживании сериализаторами, в отличие от отслеживания того, что вы делаете и не хотите отображать на контроллере или уровень просмотра.