今回はRuby on Railsのserializerというgemについて紹介します。
serializerとは?
serializerは簡単に説明すると、データをjson形式にまとめられるgemです。
例えば、以下のようなjsonを簡単に作成することができます。
[ { "id": 1, "name": "闇の魔術", "author": { "id": 1, "name": "佐藤" } }, { "id": 2, "name": "炎の書", "author": { "id": 2, "name": "山田" } }, { "id": 3, "name": "雷の書", "author": { "id": 2, "name": "山田" } } ]
Railsをapiとして利用する場合はよく利用するかもね!
serializerの導入方法
gem 'active_model_serializers'
bundle install
serializerの設定方法
serializerを導入することができたら次は設定していきます。
serializerのファイル作成
rails g serializer モデル名
例えば、Booksモデルのserializerを使いたい場合は、以下のように記載します。
rails g serializer Book
上記のものをターミナルで叩くと、`app/serializers/book_serializer.rb`というパスが自動で生成されます。
serializerの中身を設定
serializerの中身を記載する前に、前提として以下のテーブルが存在するとします。
create_table "authors", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "books", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.bigint "author_id"
t.index ["author_id"], name: "index_books_on_author_id"
end
BookテーブルとAuthorテーブルがあります。
関係は1対多です。
Bookだけ出力してみる
ではまずBookだけを出力してみます。
app/serializers/book_serializer.rbを以下のように設定していきます。
class BookSerializer < ActiveModel::Serializer
attributes %i[id name]
end
attributesにはjsonとして出力するカラムを記載しています。
今回のBooksテーブルには、id、name、created_at、updated_atがありますが、その中からidとnameだけjsonで出力するように設定します。
次にcontrollerを設定します。
class BooksController < ApplicationController
def index
books = Book.all
render json: books, each_serializer: BookSerializer
end
end
render json: books, each_serializer: BookSerializerと記載することで、serializerで設定したjsonを出力することができます。
そして、http://localhost:3000/booksにアクセスすると以下のjsonが返ってきました。
[ { "id": 1, "name": "闇の魔術" }, { "id": 2, "name": "炎の書" }, { "id": 3, "name": "雷の書" } ]
BookとAuthorの関係を出力してみる。
BookとAuthorの関係は1対多ですが、この関係ごと出力したい場合もあるでしょう。
そんな時は、serializerを以下のように設定します。
class BookSerializer < ActiveModel::Serializer
attributes %i[id name]
belongs_to :author, serializer: AuthorSerializer
end
class AuthorSerializer < ActiveModel::Serializer
attributes %i[id name]
has_many :books, serializer: BookSerializer
end
controllerは上記のものと同様で構いません。
その出力結果が以下のようになります。
[ { "id": 1, "name": "闇の魔術", "author": { "id": 1, "name": "佐藤" } }, { "id": 2, "name": "炎の書", "author": { "id": 2, "name": "山田" } }, { "id": 3, "name": "雷の書", "author": { "id": 2, "name": "山田" } } ]
リレーションごと取得できたね!
所感
今回はserializerを使ってみました。
RailsをAPIとして利用している場合はほぼほぼ使うgemなのかなと思うので、慣れておくと便利かなと思います。
ぜひ参考に!
コメント