top_logo

Gem jsonapi-serializerの基本的な使い方まとめ

2022年 04月 03日

jsonapi-serializerの基本的な使い方をまとめました!!


以前はfast_jsonapiと呼ばれていたようです!


現在もアップデートされ続けており、アップデートするたびに他のシリアライザーより処理時間が速くなっているのを保証すると Github に書いてあります!


すごい!

導入

Gemfileに追加


gem 'jsonapi-serializer'

インストール


$ bundle install

モデルクラスを指定してシリアライザークラスを作成します。


$ rails g serializer Article
Running via Spring preloader in process 40421
create  app/serializers/article_serializer.rb

基本的な使い方

シリアライザークラスは以下のように書きます。


set_idには欲しいidを、attributesには欲しいカラムを書きます。


set_id :user_idという書き方も可能です!


app/serializers/article_serializer.rb
class ArticleSerializer
  include JSONAPI::Serializer
  set_type :article
  set_id :id
  # 欲しいカラム
  attributes :title, :contents, :status
  # 欲しい関連付け
  belongs_to :user
end

API を以下のように作成します。


app/controllers/api/v1/articles_controller.rb
class Api::V1::ArticlesController < ApplicationController
  def index
    articles = Article.all
    json_string = ArticleSerializer.new(articles).serialized_json
    render json: json_string
  end

この API にリクエストを送ると以下のようなレスポンスが返ってきます。

"data": [
    {
        "id": "1",
        "type": "article",
        "attributes": {
            "title": "MyString1",
            "contents": "MyText1",
            "status": "draft"
        },
        "relationships": {
            "user": {
                "data": {
                    "id": "1",
                    "type": "user"
                }
            }
        }
    },
    {
        "id": "2",
        "type": "article",
        "attributes": {
            "title": "MyString2",
            "contents": "MyText2",
            "status": "draft"
        },
        "relationships": {
            "user": {
                "data": {
                    "id": "2",
                    "type": "user"
                }
            }
        }
    },
.
.
.

belongs_to :userによって関連付けしたuserid,typeが帰ってきています。


"relationships": {
    "user": {
        "data": {
            "id": "1",
            "type": "user"
        }
    }
}

これはhas_manyの場合も同様です。

関連付け先の詳細の値を取得

以下の方法で関連付け先の詳細な値を取得できます。

app/serializers/article_serializer.rb
class ArticleSerializer
  include FastJsonapi::ObjectSerializer
  set_type :article
  set_id :id
  attributes :title, :contents, :status

  attribute :article_user do |object|
    "#{object.user.name}"
  end
end

以下の記述で新たに返却するカラムを作成し、その中で関連付け先のuserの名前を指定しています。


attribute :article_user do |object|
  "#{object.user.name}"
end

以下のレスポンスを取得

"data": {
    "id": "1",
    "type": "article",
    "attributes": {
        "title": "MyString1",
        "contents": "MyText1",
        "status": "draft",
        "article_user": "MyString1"
    }

パラメーターから送信する値を判定

リクエストで受け取ったパラメーターから返却する値を変えることもできます。


attribute :can_view_early do |movie, params|
  params[:current_user].is_employee? ? true : false
end

リンクを作成

以下のようにオブジェクトごとにリンクを作成することもできます。


app/serializers/article_serializer.rb

class ArticleSerializer
  include FastJsonapi::ObjectSerializer
  set_type :article
  set_id :id
  attributes :title, :contents, :status
  belongs_to :user
  link :custom_url do |object|
    "http://article.com/#{object.title}"
  end

  link :personalized_url do |object, params|
    "http://article.com/#{object.title}-#{object.user.email}"
  end
end

以下のようなレスポンスが返ります。


{
    "id": "1",
    "type": "article",
    "attributes": {
        "title": "MyString1",
        "contents": "MyText1",
        "status": "draft"
    },
    "relationships": {
        "user": {
            "data": {
                "id": "23",
                "type": "user"
            }
        }
    },
    "links": {
        "custom_url": "http://article.com/MyString1",
        "personalized_url": "http://articles.com/MyString1-user1@example.com"
    }
}

まとめは以上になります!

連絡先

何か連絡をしたい際は以下 SNS、メールでお願いいたします。

Twitter:  https://twitter.com/naka_ryo_z

Github:  https://github.com/ryotaro-tenya0727

メール:   ryotaro123110@gmail.com

見出しへのリンク

© 2024, written by Nakayama

Powered by Gatsby