传递枚举对象至FastJsonapi序列化器时触发id必填字段错误求助
解决FastJsonAPI序列化枚举值时的
id is mandatory field错误 这个错误的核心原因很明确:FastJsonAPI严格遵循JSON:API规范,要求每个被序列化的资源必须包含id字段,但你通过Organisation.ownerships获取的枚举值只是普通的键值对(或数组),并非带有id属性的ActiveRecord模型实例,所以触发了这个强制字段校验错误。
下面是两种针对性的解决方案:
方案一:将枚举转换为带id的结构化数据(适用于哈希型枚举)
如果你的ownerships是类似{1: '个人所有', 2: '企业所有'}的哈希枚举,可以把它转换成包含id和显示值的哈希数组,让每个元素符合FastJsonAPI的资源要求:
# 转换枚举值为带id的结构 @drop_down_values = Organisation.ownerships.map do |key, value| { id: key, label: value } end # 序列化渲染 render json: DropDownValueSerializer.new(@drop_down_values).serialized_json
对应的序列化器需要声明要序列化的属性:
class DropDownValueSerializer include FastJsonapi::ObjectSerializer attributes :label end
这里用枚举的键作为id,既保证唯一性,也能和数据库存储的枚举值对应,非常实用。
方案二:用索引作为id(适用于数组型枚举)
如果你的ownerships是纯数组(比如['个人所有', '企业所有']),可以用数组索引作为id:
# 转换枚举值为带id的结构 @drop_down_values = Organisation.ownerships.each_with_index.map do |value, idx| { id: idx + 1, label: value } end # 序列化渲染逻辑同上
额外提示
- 确保
id字段的值是唯一的,JSON:API规范允许id是字符串或数字,只要能唯一标识每个资源即可。 - 如果你不需要严格遵循JSON:API规范,也可以直接用Ruby原生的
to_json方法序列化枚举值,比如render json: Organisation.ownerships.to_json,但这样就失去了FastJsonAPI的标准化结构优势。
内容的提问来源于stack exchange,提问作者Nandhini
相关产品推荐
相关产品推荐

