You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails API使用JSONAPI serializer访问attributes报Symbol转Integer错误

报错原因

TypeError: no implicit conversion of Symbol into Integer 报错的触发逻辑非常明确:

  • 当JSONAPI Serializer接收的是多条记录的集合(比如Appartment.all返回的结果)时,serializable_hash[:data]返回值是数组类型,Ruby数组的[]取值方法仅接受整数类型的下标参数。你直接对数组调用[:attributes],相当于尝试把Symbol类型的:attributes作为数组下标使用,自然触发类型转换错误。
  • 只有传入单条资源记录时,serializable_hash[:data]才会返回单个Hash对象,此时才能直接通过[:attributes]访问属性字段。

你移除[:attributes]后返回的结构也能印证这一点::data对应的值是由多个{id: xxx, type: xxx, attributes: xxx}对象组成的数组,而非单个嵌套对象。

正确实现方案

要返回纯属性的扁平化数组,只需要遍历:data下的每一项资源,单独提取每项的attributes字段即可,修正后的控制器代码如下:

def index
  @appartments = Appartment.all
  serialized_collection = AppartmentSerializer.new(@appartments).serializable_hash[:data]
  render json: serialized_collection.map { |item| item[:attributes] }
end

如果业务需要在返回结果中携带资源id(多数前端交互场景需要该字段),可以在遍历过程中把id合并入属性哈希:

def index
  @appartments = Appartment.all
  serialized_collection = AppartmentSerializer.new(@appartments).serializable_hash[:data]
  render json: serialized_collection.map { |item| item[:attributes].merge(id: item[:id].to_i) }
end

内容的提问来源于stack exchange,提问作者Lukas Guldstøv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:39:27