Edited at

Railsのactive_model_serialiserについて学ぶ③_100DaysOfCodeチャレンジ12日目(Day_11:#100DaysOfCode)

More than 1 year has passed since last update.


はじめに

この記事はTwitterで人気のハッシュタグ#100DaysOfCodeをつけて、

100日間プログラミング学習を続けるチャレンジに挑戦した12日目の記録です。


動作環境


  • ruby 2.4.1

  • Rails 5.0.1


現在学習している内容のリポジトリ

https://github.com/yuta-ushijima/notebook-api-on-rails


本日学んだこと


  • active_model_serialiser(アクティブ・モデル・シリアライザー)におけるmeta_tag

前々回前回に引き続き、active_model_serialiserについて深掘りしていきます。


active_model_serialiserにメソッドを定義してみる

serialiser.rbにメソッドを定義してattributeメソッドの引数にシンボルを渡すと、JSONのオブジェクトを生成する際にフィールドとして表示させることができます。

既存のモデルを継承しているため、色々とカスタマイズできるのがいいですね。

例えば、first_nameとLast_nameがあった場合、active_model_serialiserfull_nameメソッドを定義してattributeで渡せば、JSONオブジェクトにfull_nameのフィールドを追加することができます。


使いどころ


  • カスタム属性をJSONのレスポンスに含めたい場合


メソッドの定義方法

class ContactSerializer < ActiveModel::Serializer

attributes :id, :name, :email, :birthdate, :author

# モデル同士の関連付け
belongs_to :kind
has_many :phones
has_one :address

def author
"ウェブ系ウシジマくん"
end
end

レスポンスの結果は以下の通りです。

"data": {

"id": "3",
"type": "contacts",
"attributes": {
"name": "池田 陸",
"email": "ariane@jacobson.org",
"birthdate": "2016-10-13",
"author": "ウェブ系ウシジマくん", # ここが追加部分
"birthday": "2016-10-13T00:00:00+09:00"
}
}

ちなみに、active_model_serialiserを使わなくても、controllerのrenderメソッドにmetaオプションを使ってハッシュを渡せば、同等のことができます。

class ContactsController < ApplicationController

<中略>
# GET /contacts/1
def show
render json: @contact, include: [:kind, :phones, :address], meta: { author: "ウェブ系ウシジマくん" }
end
<中略>

レスポンスの結果は以下の通りです。

"data": {

<中略>
"meta": {
"author": "ウェブ系ウシジマくん" # 追加部分
}
}


まとめ

Active_Model_Serializerを使用してJSON出力に追加情報を追加するには、metaオプションを使用すればOKということですね。

meta: { my: 'info' }


参考リンク

https://github.com/rails-api/active_model_serializers/blob/v0.10.6/docs/general/serializers.md