12/08/2018, 13:51

Hướng dẫn sử dụng gem active_model_serializers trong việc quy định dữ liệu trả về trong json

Trong hệ thông client và server, chúng ta đã khá quen thuộc về cấu trúc dữ liệu json. Và khi 1 request của client gửi tới server lấy thông tin, có nhưng thông tin ta muốn giấu thì phải làm thế nào? Gem active_model_serializers sẽ giúp chúng ta làm điều đó Đầu tiên hãy thử với ví dụ sau: ...

Trong hệ thông client và server, chúng ta đã khá quen thuộc về cấu trúc dữ liệu json. Và khi 1 request của client gửi tới server lấy thông tin, có nhưng thông tin ta muốn giấu thì phải làm thế nào?

Gem active_model_serializers sẽ giúp chúng ta làm điều đó

Đầu tiên hãy thử với ví dụ sau:

render json: {message: "", data: {user: @user}, code: 1}, status: 200

Đoạn code trên sẽ trả về toàn bộ thông tin của user, và thông tin và chúng ta hãy xem thông tin của user:

{
  "message": "",
  "data": {
    "user": {
      "status": "actived",
      "id": 10,
      "authentication_token": "HxKuyKEsjN2pjm6FsVzh",
      "name": "Nguyen Van B",
      "email": "nguye.van.b@framgia.com",
      "address": null,
      "current_location": "Handico Tower, Phạm Hùng, Mễ Trì Hạ, Mễ Trì, Từ Liêm, Hà Nội, Vietnam",
      "latitude": 21.0166519,
      "longitude": 105.7818388,
      "phone_number": "+841234567891",
      "plate_number": null,
      "role": "shop",
      "rate": 1.5,
      "pin": null,
      "signed_in": true,
      "created_at": "2016-08-25T11:02:20.000Z",
      "updated_at": "2016-08-27T14:25:44.000Z"
    }
  },
  "code": 1
}

Có rất nhiều thông tin không cần thiết cũng như cần bảo mật.

Và bây giờ chúng ta sẽ lọc những thông tin cần trả về

B1: Thêm gem 'active_model_serializers' và bundle
B2: rails g serializer user ( Ở đây là với user, chúng ta có thể làm với các đối tượng tùy ý khác )
B3: Trong mục app/serializers/user_serializers.rb
class UserSerializer < ActiveModel::Serializer
  attributes :id, :name, :email, :address,  :phone_number
end
Ở phần attributes thêm những trường dữ liệu cần trả về
Ngoài ra có thể chèn thêm dữ liệu không phải là trường của user
Ví dụ:
   class UserSerializer < ActiveModel::Serializer
      attributes :id, :name, :email, :address,  :phone_number, :users
      def users
          User.all
      end
   end
B4: Thiết lập trả về
@user = ActiveModelSerializers::SerializableResource.new(@user, option={})
render json: {message: "", data: {user: @user.as_json}, code: 1}, status: 200

Kết quả trả về sẽ là :

{
  "message": "",
  "data": {
    "user": {
      "id": 10,
      "name": "Nguyen Van B",
      "email": "nguye.van.b@framgia.com",
      "address": null,
      "phone_number": "+841234567891",
    }
  },
  "code": 1
}

Như vậy chúng ta đã loại bỏ được các trường dữ liệu cần thiết rồi

Cảm ơn các bạn đã quan tâm theo dõi

0