Active Model Serializerを使ってAPIを生成してみました。
しかし、一部で少し詰まったので記録しておきます。
やりたいJSONの形
{
"data": [
{
"id": 1,
"category_name": "study",
"body": "hoge"
},
{
"id": 2,
"category_name": "study",
"title": "hogehoge"
}
]
}
こちらで指定したハッシュ(data)の中にネストしたい。
問題
コントローラでrenderを行い、jsonにtodosの変数を渡す。
その際に、"data"というハッシュの中にそれらの値を入れたい・・・が、
変数を直接dataハッシュの中に入れると、Serializeで整理したはずが全部表示されてしまう・・・
controller
def index
todos = Todo.where(type: 'animal')
render json: {data: todos}, each_serializer: TodoSerializer
# jsonに渡すデータが複数の(where等で取ってきた)場合はeach_serializer、単数の(find等で取ってきた)場合はserializer
end
{
"data": [
{
"id": 1,
"category_id": "1",
"body": "hoge"
"created_at": "2021-05-24T17:52:32.917Z",
"updated_at": "2021-05-24T17:52:32.917Z"
},
{
"id": 2,
"category_id": "1",
"title": "hogehoge"
"created_at": "2021-05-24T18:10:49.294Z",
"updated_at": "2021-05-24T18:10:49.294Z"
}
]
}
解決方法
adapterというオプションを使用して、引数としてルートキーを指定すると実現可能に!
(もしかしたら他にもやりようがあるかもしれないが)
json: todos, root: 'data', each_serializer: TodoSerializer, adapter: :json
⏬ Overriding the root key
https://github.com/rails-api/active_model_serializers/blob/v0.10.6/docs/general/rendering.md#overriding-the-root-key
最初スルーしてしまっていたけど、ドキュメントはちゃんと読もう。。