Serializer trong ActiveModelSerializers
Bài đăng này đã không được cập nhật trong 7 năm
ActiveModelSerializers
tạo convention về cấu hình sang dạng Json.
ActiveModelSerializers
hoạt động thông qua hai thành phần: serializers
và adapter
.
Serializers
mô tả về các thuộc tính và các mối quan hệ cần được nhắc đến.
Adapters
mô tả cách mà các thuộc tính và các mối quan hệ được nhắc đến.
SerializableResource
phối hợp các resources , Adapter
và Serializer
để xuất bản các tài nguyên serialization. Các serialization có #as_json, #to_json và #serializable_hash các phương pháp được sử dụng bởi Rails JSON Renderer.
(SerializableResource đại diện cho những phương pháp chuyển đổi các bộ).
Theo mặc định ActiveModelSerializers
sẽ sử dụng các thuộc tính adapter (không có dạng JSON). Nhưng các bạn nên sử dụng JsonApi adapter, định dạng 1.0 quy định tại jsonapi.org/format. Dưới đây là sự thay đổi ở các bộ chuyển đổi:
0.10.x là không tương thích ngược với 0.9.x cũng như 0.8.x.
0.10.x được dựa trên mã 0.8.x, nhưng với kiến trúc linh hoạt hơn.
Cài đặt
Thêm dòng sau vào file Gemfile trong ứng dụng của bạn:
`gem "active_model_serializers", "~> 0.10.0"`
Và sau đó chạy lệnh:
`$ bundle`
Serializers
Tạo Serializer
Cách dễ nhất để tạo một serializer
mới là tạo một resources mới, mà sẽ tạo một serializer cùng một lúc:
$ rails g resource post title:string body:string
Điểu này sẽ tạo ra một serializer trong app/serializers/post_serializer.rb
cho mô hình mới. Bạn cũng có thể tạo ra một serializer cho một mô hình bằng cách:
$ rails g serializer post
Serializer tạo ra sẽ chứa các attributes và các mối quan hệ has_many/has_one/belongs_to dựa trên mô hình. Ví dụ:
class PostSerializer < ActiveModel::Serializer
attributes :title, :body
has_many :comments
has_one :author
end
và
class CommentSerializer < ActiveModel::Serializer
attributes :name, :body
belongs_to :post_id
end
Danh sách tên các thuộc tính là một danh sách của thuộc tính được lựa chọn.
Các has_many, has_one và belongs_to khai báo mô tả các mối quan hệ giữa các resources. Theo mặc định, khi bạn serialize Post
, bạn lấy được các Comments
của nó một cách dễ dàng.
Một số thông tin khác về Serializers
:
Namesspaced Models
Khi serializing model vào trong namespace, giống như Api::V1::Post
, ActiveModelSerializers
sẽ mong đợi các serializer tương ứng bên trong cùng không gian tên (cụ thể Api::V1::PostSerrializer
).
Model Associations và Nested Serializers
Khi bạn khai báo serializer
cho model với associations
, giống như:
class PostSerializer < ActiveModel::Serializer
has_many :comments
end
ActiveModelSerializers
sẽ tìm kiếm PostSerializer::CommentSerializer
, và trở lại ::CommentSerializer
trong các trường hợp không tồn tại. Điều này cho phép kiểm soát nhiều hơn đối với mô hình được đăng ký như một hiệp hội của một mô hình khác.
Ví dụ, trong các tình huống sau đây:
class CommentSerializer < ActiveModel::Serializer
attributes :body, :date, :nb_likes
end
class PostSerializer < ActiveModel::Serializer
has_many :comments
class CommentSerializer < ActiveModel::Serializer
attributes :body_short
end
end
ActiveModelSerializers
sẽ sử dụng PostSerializer::CommentSerialize
( như vậy, chỉ bao gồm các thuộc tính :body_short
) khi serializing Comment
giống như một phần của Post
, nhưng sử dụng ::CommentSerializer
khi serializing một cách trực tiếp từ Comment
(do đó bao gồm :body, :date, :nb_likes
).
Mong rằng bài viết của mình sẽ mang lại cho các bạn cái nhìn đầu tiên về serializer trong ActiveModelSerializer.
Tài liệu:
https://github.com/rails-api/active_model_serializers
https://github.com/rails-api/active_model_serializers/blob/master/docs/general/getting_started.md
All rights reserved