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
相关产品推荐
相关产品推荐

