Active Model Serializers渲染值数组仅显示第一个值问题
解决ActiveModelSerializers渲染数组仅输出第一个元素的问题
这个问题在AMS 0.10.x版本里很常见,根源在于你创建的Step实例没有唯一的id属性,而JSON:API规范(以及AMS的实现)依赖id+type来区分不同的资源对象。
为什么只输出第一个?
ActiveModelSerializers::Model默认会把模型类名(这里是"step")作为所有实例的id值,也就是说你数组里的5个Step实例,它们的id都是"step"、type都是"step"。AMS会认为这些是同一个资源的重复条目,所以最终只保留第一个。
两种解决思路
1. 给Step模型添加唯一id
因为你已经用了uniq处理value,所以可以直接把value作为每个实例的唯一id:
class Step < ActiveModelSerializers::Model attr_accessor :value, :id def initialize(attributes = {}) super # 利用唯一的value生成id,保证每个实例id不重复 self.id = attributes[:value].to_s end end
2. 在序列化器中重写id方法
如果不想修改模型,也可以在StepSerializer里自定义id的返回值:
class StepSerializer < ActiveModel::Serializer attributes :value def id # 用value作为唯一标识,转成字符串符合JSON:API的id格式要求 object.value.to_s end end
修改后的效果
完成上面任意一种修改后,重新请求接口,你会得到预期的输出:
{ "data": [ { "id": "1", "type": "step", "attributes": { "value": 1 } }, { "id": "2", "type": "step", "attributes": { "value": 2 } }, { "id": "3", "type": "step", "attributes": { "value": 3 } }, { "id": "4", "type": "step", "attributes": { "value": 4 } }, { "id": "5", "type": "step", "attributes": { "value": 5 } } ] }
内容的提问来源于stack exchange,提问作者jmccartie
相关产品推荐
相关产品推荐

