Serializer trong ActiveModelSerializers
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 ...
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