升级Ember-data至2.14后ActiveModelSerializer空hasMany字段请求异常
解决Ember Data 2.14.11中ActiveModelSerializer空hasMany字段不发送的问题
我刚好碰到过这个问题——Ember Data 2.14版本开始,ActiveModelSerializer的默认行为发生了变化:当hasMany关联没有任何记录时,对应的_ids字段会被从请求载荷中省略,不再像2.13那样发送空数组。要解决这个问题,最直接的方式是自定义序列化器来强制保留空关联字段:
方法一:全局自定义序列化器(推荐)
创建或修改项目根目录下的app/serializers/application.js,继承自ActiveModelSerializer并重写serializeHasMany方法:
import ActiveModelSerializer from 'active-model-adapter/serializer'; export default ActiveModelSerializer.extend({ serializeHasMany(snapshot, json, relationship) { // 先调用父类方法处理正常关联的序列化 this._super(snapshot, json, relationship); const { key } = relationship; // 转换为ActiveModel风格的字段名(比如posts → post_ids) const payloadKey = this.keyForRelationship(key, 'hasMany'); // 如果载荷中没有该字段,说明关联为空,手动添加空数组 if (!json[payloadKey]) { json[payloadKey] = []; } } });
这个方法会对所有模型生效,确保所有空的hasMany关联都会发送对应的空数组字段。
方法二:针对单个模型处理
如果你只需要调整特定模型(比如User)的行为,可以单独创建app/serializers/user.js:
import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ // 这里可以保留全局逻辑,或者针对User模型做更特殊的处理 });
原理说明
重写serializeHasMany方法后,我们先让父类完成常规的序列化流程,然后检查对应的_ids字段是否存在于请求载荷中。如果不存在,就说明当前关联没有任何记录,这时我们手动给载荷添加一个空数组,这样就能完全恢复到Ember Data 2.13版本的行为,确保后端能接收到post_ids: []这类字段。
另外,你当前使用的active-model-adapter@2.2.0和Ember Data 2.14是兼容的,不需要升级适配器版本,通过自定义序列化器就能解决问题。
内容的提问来源于stack exchange,提问作者Alex Strizhak
相关产品推荐
相关产品推荐

