active_model_serializersの処理の流れメモ

ancestryとactive_model_serializersの連携について調べていたらactive_model_serializersを読み込むはめになったのでメモしておきます。

基本的な動作

どうやってシリアライズ(=> JSON)しているか

  1. ActiveModel::Serializerにシリアライズ対象(ActiveModelのオブジェクトもしくはその配列)とシリアライズオプションを渡してserializerオブジェクトを生成
  2. ActiveModel::Serializer::Adapterに1で作成したオブジェクトとオプション(どのアダプタを使うか。デフォルトはJSON)を渡してadapterオブジェクトを生成
  3. ActiveModel::Serializer::Adapter#as_jsonで1のシリアライザが適用される

respond_withからの流れを含めたシリアライズの流れ

(active_model_serializersをインストールするとActionControllerにactive_model_serializersのActionController::Serializationがincludeされ、respondersのメソッド(respond_withなど)をラップします)

  1. respond_with object
  2. ラップしたrespond_withで「シリアライズの流れ」1, 2を実施
  3. respondersのrespond_withに2で作成したadapterを渡す(adapterはrespond_withで使用するJSON変換メソッドを提供するのでシリアライズできる)

ちょっとした発見

  1. ActiveModel::Serializer.attributesに入れたものはserializerが適用できない
  2. ActiveModel::Serializer.attributeはkeyを変更するだけのもの(attribute :hoge, key:mogeとすると、"moge": { //hoge }の形でJSONが出てくる

ツリー構造をもつモデルの場合ツリー構造のJSONを吐きたい

1.の原則の通りツリー構造でデータを吐き出すときはちょっとした工夫が必要です。そのうちQiitaに書きます