Pengenalan modul ActiveModel::Serialization
Akhirnya Rails 6.0.0 sudah rilis secara resmi pada tanggal 15 Agustus kemarin.
Pada versi ini, Rails membawa banyak perubahan-perubahan yang sangat menyenangkan para rails developer seperti webpacker by default, multiple database, action text, pararel testing dan lain-lain.
Namun saat ini yang saya ingin bahas disini bukan fitur-fitur tersebut, melainkan sebuah module baru di dalam ActiveModel yaitu Serialization.
Akhirnya setelah penantian yang cukup panjang, rails dapat memiliki serializer-nya sendiri hehehe
Jika kita lihat dokumentasi yang disediakan kita bisa membuat kelas serializer dengan langsung meng-include modulenya seperti ini:
class Person
include ActiveModel::Serialization
attr_accessor :name
def attributes
{'name' => nil}
end
end
Dan untuk penggunaanya seperti ini:
person = Person.new
person.serializable_hash # => {"name"=>nil}
person.name = "Bob"
person.serializable_hash # => {"name"=>"Bob"}
Atau jika anda ingin mengeluarkan langsung sebuah json dari serializer anda:
class Person
include ActiveModel::Serializers::JSON
attr_accessor :name
def attributes
{'name' => nil}
end
end
Untuk penggunaannya:
person = Person.new
person.serializable_hash # => {"name"=>nil}
person.as_json # => {"name"=>nil}
person.to_json # => "{\"name\":null}"
person.name = "Bob"
person.serializable_hash # => {"name"=>"Bob"}
person.as_json # => {"name"=>"Bob"}
person.to_json # => "{\"name\":\"Bob\"}"
Semenjak kita menggunakan rails yang menyediakan render json:
seharusnya kita tidak memperlukan serializer yang menghasilkan data json langsung karna yang kita butuhkan cukup hash saja.
Tapi mungkin module ini akan diperlukan untuk anda yang menggunakan ActiveRecord namun tidak menggunakan Rails. Atau anda menggunakan rails namun lebih suka dengan method as_json()
daripada serializable_hash()
yang bisa kita lihat kedua method tersebut adalah sama :D.
Beberapa contoh diatas saya ambil dari dokumentasinya langsung, namun pada realitas kita perlu mengubah kelas-kelas ini. Untuk menjelaskan ini mari kita buat contoh kasus dengan menampilkan data json article dari article tertentu berdasarkan id-nya.
Pada controller, kita akan membuatnya seperti ini:
class ArticleController < ApplicationController
def show
article = Article.find_by(params[:id])
serializer = ArticleSerializer.new(article)
serializer_hash = serializer.serializable_hash
render json: { article: serializer_hash }
end
end
Untuk kode serializer-nya kita dapat membuatnya seperti ini:
class ArticleSerializer
include ActiveModel::Serialization
attr_reader :title, :body
def initialize(article)
@title = article.title
@body = article.body
end
def attributes
{ 'title' => nil, 'body' => nil }
end
end
Maka hasilnya adalah
{
"article": {
"title": "Sample article title",
"body": "Sample content of article"
}
}
Pada kode diatas saya menambahkan method initialize
agar proses inisialisasi atribut dilakukan di dalam kelas serializer sehingga jika atribut-nya banyak, proses tidak dibebankan kepada controller.
Saya kira tulisan ini cukup sekian saja,
Happy hacking ~