12/08/2018, 14:26

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

     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

0