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
isfirst\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;
}
}
});