Ember.js 规范化余烬中的错误有效负载

Ember.js 规范化余烬中的错误有效负载,ember.js,ember-data,Ember.js,Ember Data,假设我有一个人模型 App.Person = DS.Model.extend firstName: DS.attr 'string' lastName: DS.attr 'string' email: DS.attr 'string' 我正在使用ember数据,调用一个使用下划线属性名的RESTAPI(即,firstNameisfirst\u name),因此我正在定制ApplicationSerializer以执行“全面”规范化(请参阅) 这对于序列化和规范服务器之间的数据非常有

假设我有一个
模型

App.Person = DS.Model.extend
  firstName: DS.attr 'string'
  lastName: DS.attr 'string'
  email: DS.attr 'string'
我正在使用
ember数据
,调用一个使用下划线属性名的RESTAPI(即,
firstName
is
first\u name
),因此我正在定制
ApplicationSerializer
以执行“全面”规范化(请参阅)

这对于序列化和规范服务器之间的数据非常有用。但是,来自服务器的错误怎么办

假设我有一个操作,它尝试将
PUT
更新
Person
记录。我有按钮了

# Somewhere in the person/edit template
<button {{action "save"}}>Save</button>
但这会在带下划线的属性名称上设置错误(即,
{first\u name:[“不能为空”]}
)。为了显示错误,我必须将视图绑定到带下划线的属性名称。然后我的视图将绑定到
firstName
firstName
属性

如何使用相同的序列化程序规范化错误负载以保持一致性


编辑


我没有覆盖
ajaxError
钩子,而是使用了kingpin2k在回答中提到的
ActiveModelSerializer
ActiveModelAdapter
。这将规范化和序列化从带下划线的属性到camelCased属性的数据和错误。

覆盖适配器上的ajaxError钩子,以下是活动模型适配器的操作方式

App.ApplicationAdapter = DS.RESTAdapter.extend({
 /**
    The ActiveModelAdapter overrides the `ajaxError` method
    to return a DS.InvalidError for all 422 Unprocessable Entity
    responses.

    @method ajaxError
    @param jqXHR
    @returns error
  */
  ajaxError: function(jqXHR) {
    var error = this._super(jqXHR);

    if (jqXHR && jqXHR.status === 422) {
      var jsonErrors = Ember.$.parseJSON(jqXHR.responseText)["errors"],
          errors = {};

      forEach(Ember.keys(jsonErrors), function(key) {
        errors[Ember.String.camelize(key)] = jsonErrors[key];
      });

      return new DS.InvalidError(errors);
    } else {
      return error;
    }
  }

});
你的可能类似,但忽略422

App.ApplicationAdapter = DS.RESTAdapter.extend({
 /**
    The ActiveModelAdapter overrides the `ajaxError` method
    to return a DS.InvalidError for all 422 Unprocessable Entity
    responses.

    @method ajaxError
    @param jqXHR
    @returns error
  */
  ajaxError: function(jqXHR) {
    var error = this._super(jqXHR);

    if (jqXHR) {
      var jsonErrors = Ember.$.parseJSON(jqXHR.responseText)["errors"],
          errors = {};

      forEach(Ember.keys(jsonErrors), function(key) {
        errors[Ember.String.camelize(key)] = jsonErrors[key];
      });

      return new DS.InvalidError(errors);
    } else {
      return error;
    }
  }

});

我甚至不知道有一个
ActiveModelSerializer
。因为我使用Rails作为后端,所以我将尝试使用这个适配器。它是如何从服务器返回错误的呢?我很确定以您发送它们的格式,它是DS.ActiveModelAdapter它是发送回422的吗?那么模型处于无效状态?哈!我使用的是
ActiveModelSerializer
,但不是
ActiveModelAdapter
。我更新了我的
ApplicationAdapter
以使用
ActiveModelAdapter
,它成功了。谢谢!
App.ApplicationAdapter = DS.RESTAdapter.extend({
 /**
    The ActiveModelAdapter overrides the `ajaxError` method
    to return a DS.InvalidError for all 422 Unprocessable Entity
    responses.

    @method ajaxError
    @param jqXHR
    @returns error
  */
  ajaxError: function(jqXHR) {
    var error = this._super(jqXHR);

    if (jqXHR && jqXHR.status === 422) {
      var jsonErrors = Ember.$.parseJSON(jqXHR.responseText)["errors"],
          errors = {};

      forEach(Ember.keys(jsonErrors), function(key) {
        errors[Ember.String.camelize(key)] = jsonErrors[key];
      });

      return new DS.InvalidError(errors);
    } else {
      return error;
    }
  }

});
App.ApplicationAdapter = DS.RESTAdapter.extend({
 /**
    The ActiveModelAdapter overrides the `ajaxError` method
    to return a DS.InvalidError for all 422 Unprocessable Entity
    responses.

    @method ajaxError
    @param jqXHR
    @returns error
  */
  ajaxError: function(jqXHR) {
    var error = this._super(jqXHR);

    if (jqXHR) {
      var jsonErrors = Ember.$.parseJSON(jqXHR.responseText)["errors"],
          errors = {};

      forEach(Ember.keys(jsonErrors), function(key) {
        errors[Ember.String.camelize(key)] = jsonErrors[key];
      });

      return new DS.InvalidError(errors);
    } else {
      return error;
    }
  }

});