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 ~