はじめに
この記事はTwitterで人気のハッシュタグ#100DaysOfCode
をつけて、
100日間プログラミング学習を続けるチャレンジに挑戦した12日目の記録です。
動作環境
- ruby 2.4.1
- Rails 5.0.1
現在学習している内容のリポジトリ
本日学んだこと
- active_model_serialiser(アクティブ・モデル・シリアライザー)におけるmeta_tag
前々回、前回に引き続き、active_model_serialiserについて深掘りしていきます。
active_model_serialiserにメソッドを定義してみる
serialiser.rb
にメソッドを定義してattribute
メソッドの引数にシンボルを渡すと、JSONのオブジェクトを生成する際にフィールドとして表示させることができます。
既存のモデルを継承しているため、色々とカスタマイズできるのがいいですね。
例えば、first_nameとLast_nameがあった場合、active_model_serialiser
にfull_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' }