やりたいこと
たとえばこんなふうに
- 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オープンチャットもご利用ください。