Rails APIでJbuilderのViews出力時のエラー

現象1 配列ではないのにjson.array利用でエラー

エラー内容とコード

"exception": "#<ActionView::Template::Error: undefined method `map' for #<AgendaItem id: 10, agenda_group_id: 1, name: \"Project Phases\", order_number: 1, created_at: \"2021-09-05 07:21:39.276841000 +0000\", updated_at: \"2021-09-05 07:21:39.276841000 +0000\", indent_level: 1>\nDid you mean?  tap>",
json.agenda_items do
    json.array! @agenda_groups.agenda_items do |ai|
        json.extract! ai,
        :id,
        :name,
        :order_number,
        :indent_level,
        :created_at,
        :updated_at
    end
end

原因

配列ではないのにjson.arrayを利用している。

対応

変数として出力する。

json.agenda_item do
    json.extract! dai.agenda_item,
        :id,
        :name,
        :order_number,
        :indent_level,
        :created_at,
        :updated_at
end

現象2 オブジェクトなのにjson.extract利用でエラー

エラー内容とコード

"exception": "#<ActionView::Template::Error: undefined method `id' for #<ActiveRecord::Associations::CollectionProxy []>\nDid you mean?  ids>",
json.agenda_details do
    json.extract! dai.agenda_item.agenda_details,
        :id,
        :body,
        :created_at,
        :updated_at
    end
end

原因

オブジェクトなのにjson.extractを利用している。

対応

配列取得(json.array)してから出力する。

json.agenda_details do
    json.array! dai.agenda_item.agenda_details do |ad|
        json.extract! ad,
        :id,
        :body,
        :created_at,
        :updated_at
    end
end

その他

Jbuilder出力時は以下の確認が重要

  • 配列か変数か(json.arrayが必要か、そのまま出力可能か)
  • 複数形か単数形か(例:has_manyのitemsか、has_oneのitemか)
  • アソシエーション設定が適切か
  • こまめなデバッグ(pで各オブジェクトごとに配列かどうか、値が取得できているかどうか、など)