🖥

#Rails + ActiveModelSerializers で API の JSON を自由に組み立てたいけど Controller

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

https://github.com/YumaInaura/YumaInaura/issues/3052

チャットメンバー募集

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

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2020-03-30

Discussion