LoginSignup
2
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-06-28

はじめに

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

参考リンク

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1