Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
23
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Railsのactive_model_serializerについて学ぶ_100DaysOfCodeチャレンジ10日目(Day_10:#100DaysOfCode)

はじめに

この記事はTwitterで人気のハッシュタグ#100DaysOfCodeをつけて、
100日間プログラミング学習を続けるチャレンジに挑戦した10日目の記録です。

動作環境

  • ruby 2.4.1
  • Rails 5.0.1

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

本日学んだこと

  • active_model_serializer(アクティブ・モデル・シリアライザー)

active_model_serializer(アクティブ・モデル・シリアライザー)とは?

RailsをAPIサーバーとして使う際に事実上必須となるライブラリ。JSONを作成する際に色々と便利な機能を提供してくれる。

カスタマイズ性が高いので使いこなせればかなり心強い味方に。

公式リポジトリ

実行コマンド

bundle exec rails g serializer モデル名

(例)
bundle exec rails g serializer contact

# 実行結果
Running via Spring preloader in process 3267
create  app/serializers/contact_serializer.rb

上記のコマンドを実行することで、appディレクトリ配下にserializersディレクトリが自動で作成され、指定したモデル名のファイル(ここではcontact_serializer.rb)が作成される。

なお、serializer生成時のデフォルトは以下のような中身になっています。

class ContactSerializer < ActiveModel::Serializer
  attributes :id
end

ファイルの中身について

ここでもう一度デフォルトのファイルを表示します。

class ContactSerializer < ActiveModel::Serializer
  attributes :id
end

ファイルに記述されているattributesですが、このメソッドにシンボルを渡すと、render jsonなどでJSONオブジェクトを表示させた際にレスポンスされるkeyとvalueを絞り込むことができます。

現在の状態でGETにより一覧取得のAPIを叩くと、idとその値だけがレスポンスとして返ってきます。

# localhost:3000/contactsをGETで叩く
# 以下は実行結果

[
    {
        "id": 1
    },
    {
        "id": 2
    },
    {
        "id": 3
    },
    {
        "id": 4
]

レスポンスされるJSONのアダプタを設定

ActiveModelSerializerには、アダプター(JSONの表示形式)を3種類用意しています。

  • :attributes (default)
  • :json
  • :json_api

先ほど紹介したattributesはデフォルトで設定されているアダプタです。

残りの:json:json_apiをデフォルトで使いたい場合には、initializersディレクトリに別途ams.rbというような(名前はなんでもいいです)ファイルを作成し、そこに以下のようなコードを書く必要があります。

# config/initializers/ams.rb
ActiveModel::Serializer.config.adapter = :json_api

こうすることで、JSONAPIという、JSONの仕様を決めている組織が制定している表示形式に沿ったレスポンスが返ってきます。

2018年6月現在、最新の仕様バージョンはv1.0。

アダプタをjson_apiにした時と、デフォルトのattributesにした時の違いは以下の通り。

attributes

[
    {
        "id": 1,
        "name": "中島 光",
        "email": "rhianna_walsh@maggio.net",
        "birthdate": "2016-05-02",
        "birthday": "2016/05/02"
    }
  ]
}

json_api



{
    "data": [
        {
            "id": "1",
            "type": "contacts",
            "attributes": {
                "name": "中島 光",
                "email": "rhianna_walsh@maggio.net",
                "birthdate": "2016-05-02",
                "birthday": "2016/05/02"
            }
        }
   ]
}

:json_api形式だと、より構造が明示的になっているのがわかります。

typeの値として書かれているのがモデル名で、attributesに記載されているのが、initializerのファイルでattributesメソッドに渡したシンボルがkeyとvalueでそれぞれレスポンスとして返ってきていますね。

参考リンク

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
23
Help us understand the problem. What are the problem?