LoginSignup
4
4

More than 1 year has passed since last update.

#Rails + ActiveModelSerializers で API の JSON を自由に組み立てたいけど Controller の render で扱いづらいので、直接 each serializer で組み立てる例

Last updated at Posted at 2020-03-30

やりたいこと

たとえばこんなふうに

  • JSON 全体はオブジェクト
  • オブジェクトの特定のキーが配列を持つ
  • キーの名前は任意につけたい

というような場合があるのだけど

{
  "all_users" : [
    {
      "id": 1,
      "name": "Alice"
    },
    {
      "id": 2,
      "name": "Bob"
    }
  ]
}

やってみた

  • 良いやり方はどうかは分からない
  • ActiveModelSerializers + Rails Controller の組み合わせは、自由なJSONを組み立てるのには、それほど向いていないような気もしている
  • render メソッドで勝手に model インスタンスを Serialize してくれる挙動は捨てて、ある程度、自分の実装で Serialize していく必要があるのかもしれない。
class UserController < ApplicationController
  def index
    render json: { all_users: index_json }
  end

  def index_json
    ActiveModel::SerializableResource.new(
      User.all,
      each_serializer: UserSerializer
    )
  end
end
class UserSerializer < ActiveModel::Serializer
  attributes :id,
             :name
end

Adapter を指定する

  • adapter: :json を指定すると JSON を Serializer の名前でネストして囲ってくれるみたいだ ( この場合は "users": [] )
  • "all_users": [] などという好きなキー名にするには Serializer 自体を AllUserSerializer とかいう名前にする必要がありそう?
  • なんか挙動が暗黙的すぎて、いままで触っていたコードではよく分かっていなかった
    render json: User.all, each_serializer: UserSerializer, adapter: :json

active_model_serializers/serializers.md at v0.10.6 · rails-api/active_model_serializers

ルートのキーを指定する

root: "all_users" などと書けば 好きなキーも指定できるみたいだ。

    render json: User.all, root: "all_users", each_serializer: UserSerializer, adapter: :json

active_model_serializers/rendering.md at v0.10.6 · rails-api/active_model_serializers

Original by Github issue

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

Twitter

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4