RailsでActiveModel::Serializerを使ってAPIを作成する
RailsでAPIを作る時の手法として、 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: []
を指定する。