Rails
active_model_serializers

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

はじめに

この記事は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