如何在Ember上获取错误hasMany(子)记录在保存期间提交给API

我有2个模型:

App.Grower = DS.Model.extend
  name: DS.attr('string')
  addresses: DS.hasMany('App.Address')

App.Address = DS.Model.extend(
  line_1: DS.attr("string")
  line_2: DS.attr("string")
  city: DS.attr("string")
  region: DS.attr("string")
  postalCode: DS.attr("string")

  grower: DS.belongsTo("App.Grower")
)

由于地址记录嵌入在Grower记录中,因此在更新时,当我保存一个种植者时,通过简单地调用model.save()或transaction.commit()也可以保存地址。

由于验证问题,我还在Update代码中有一个处理程序来处理对API的拒绝:

...
model.on "becameInvalid", =>
  errors = []
  $.each model.errors, (key, value) ->
    errors += key + " : " + value + "<br>"
...

当我从API(这是Rails的方式)得到422时,json响应还包括无效字段。 例如:

{"errors":{"name":["can't be blank"]}}

和上面的“wasInvalid”代码片断处理这个并且吐出模型(Grower)错误。

但是,如果错误出现在地址上 ,则返回如下所示:

{"errors":{"addresses.line_1":["can't be blank"]}}

他们似乎没有在模型(Grower)错误下找到。

我在哪里找到他们? 我尝试了model.get('addresses')。errorsmodel.get('addresses')。objectAt(0).errors等,但没有成功。

更新:

看看源代码,当构建错误对象时,似乎没有包含子关系错误:

rest_adapter.js

...
didError: function(store, type, record, xhr) {
  if (xhr.status === 422) {
    var json = JSON.parse(xhr.responseText),
        serializer = get(this, 'serializer'),
        errors = serializer.extractValidationErrors(type, json);

    store.recordWasInvalid(record, errors);
  } else {
    this._super.apply(this, arguments);
  }
}
...

rest_serializer.js

...
extractValidationErrors: function(type, json) {
  var errors = {};

  get(type, 'attributes').forEach(function(name) {
    var key = this._keyForAttributeName(type, name);
    if (json['errors'].hasOwnProperty(key)) {
      errors[name] = json['errors'][key];
    }
  }, this);

  return errors;
}
...

看起来只有名称与父模型上的属性匹配的错误才会返回。

问题是,在hasMany和嵌入式的情况下,父级是唯一的似乎无效的模型,即使它是可能导致验证错误的子级。 发生这种情况是因为子级作为父级的属性提交给后端API的更新操作。

那么为什么不在父模型的错误集合中包含子错误呢? 或者我错过了什么?

更新2

我在这里的ember-data github回购中提交了一个问题。 让我们来看看那里那些聪明的头脑不得不说的话。

链接地址: http://www.djcxy.com/p/64075.html

上一篇: How to get errors on Ember hasMany (child) records submitted to API during Save

下一篇: data transactions and resubmitting forms