Rails APIをJbuilder実装して実行するとCan't mergeエラー

現象

実行するとCan't mergeエラーが出力される。

Postmanで実行したときのレスポンス

    "status": 500,
    "error": "Internal Server Error",
    "exception": "#<ActionView::Template::Error: Can't merge [{\"id\"=>1}, {\"id\"=>2}] into {\"id\"=>1, \"user_id\"=>1, \"barcode\"=>\"45019517\"}>",

rails-api/app/views/scan_histories/show_relations.json.jbuilder

json.extract! @scan_history,
  :id,
  :user_id,
  :barcode

json.array! @scan_history_deposit_histories do |dh|
    json.extract! dh,
        :id
end

原因

JbuilderでJSON出力したときのJSON構造がおかしいため。

上記のJbuilderコードを無理やり出力した場合(実際にはできないが)、以下のようなJSON構造になる。id部分が構造としておかしい。

{
    "id": 1,
    "user_id": 1,
    "barcode": "45019517",
    {
            "id": 1
    },
    {
            "id": 2
    }
}

対応

正しいJSON出力にする。

rails-api/app/views/scan_histories/show_relations.json.jbuilder

json.extract! @scan_history,
  :id,
  :user_id,
  :barcode

json.deposit_histories do
  json.array! @scan_history_deposit_histories do |dh|
    json.extract! dh,
      :id
  end
end

出力結果

{
    "id": 1,
    "user_id": 1,
    "barcode": "45019517",
    "deposit_histories": [
        {
            "id": 1
        },
        {
            "id": 2
        }
    ]
}

「json.deposit_histories do 〜 end」でid部分をJSONの配列要素にして、正しいJSON構造になった。