Passion make things more better

Ruby on Rails / React.js / Swift / AWS / Docker

RailsでActiveModel::Serializerを使ってAPIを作成する

RailsAPIを作る時の手法として、 ActiveModel::Serializerを使ったものを紹介する。

インストール

Gemfileに以下を記述し、bundle installを実行する。

gem 'active_model_serializers'

Serializer用ファイルの作成

以下のコマンドにてSerialize用のファイルを作成する。

$ bundle exec rails g serializer モデル名

今回はUserモデルに対してのSerializer用のファイルを作成する。

$ bundle exec rails g serializer User

これを実行すると、app/serializers/user_serializer.rbというファイルが生成される。

Serializerファイルの編集

以下のようにattributesで指定した値がJSONのレスポンスとして返却される。

class UserSerializer < ActiveModel::Serializer
  attributes :id,
             :first_name,
             :last_name,
             :email,
             :phone_number
end

ネストを行いたい時

関連レコードを含めたい時は、通常のModel同様リレーションを設定する。UserモデルにProfileモデルが紐付いていると仮定した場合、そのリレーションの設定は以下のようになる。

class UserSerializer < ActiveModel::Serializer
  attributes :id,
             :first_name,
             :last_name,
             :email,
             :phone_number

  has_one :profile
end

実際に使用してみる

controllerで以下のようにレスポンスをJSONで返すように記述すると、作成したSerializerのファイルがうまいこと結果を整形してくれる。

※ない場合は、modelのattributesがそのまま吐き出される

render json: @user

ネストの指定

このままでは、Serializerファイルで記述したリレーションがそのまま実行され、関連レコードがすべて取得されてしまう。そうならないために、返却時にincludeを指定する。

render json: @user, include: [:profile]

このようにすることで指定したリレーションのみ適用される。

※もし関連レコードを取得する必要がない場合には、includes: []を指定する。

参考