我有 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")
)
因为地址记录嵌入在种植者记录中,所以在更新时,当我保存种植者时,地址也可以通过对 model.save() 或 transaction.commit() 的简单调用来保存。
我在更新代码中还有一个处理程序来处理由于验证问题而被 API 拒绝的情况:
...
model.on "becameInvalid", =>
errors = []
$.each model.errors, (key, value) ->
errors += key + " : " + value + "<br>"
...
当我从 API(顺便说一下 Rails)得到 422 时,json 响应还包括无效字段。例如:
{"errors":{"name":["can't be blank"]}}
并且上面的“becameInvalid”片段处理了这个并吐出模型(Grower)错误。
但是,如果错误出现在地址上,则返回如下:
{"errors":{"addresses.line_1":["can't be blank"]}}
他们似乎没有在模型(种植者)错误下找到。
我在哪里可以找到它们?我试过model.get('addresses').errors,model.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 repo 提交了一个问题。让我们看看那边的聪明人怎么说。