我使用RESTadpater来保存数据。当发生验证错误时,我想返回422响应,然后记录错误并在每个不正确的字段旁边显示一个指示。
我的REST响应状态代码如下:
Status Code:422 Unprocessable Entity
我的REST响应正文如下:
{
"message": "Validation failed",
"errors": [
{
"name": "duplicate"
}
]
}
在我的控制器中,becomeInvalid正确触发。
App.AuthorsNewController = Ember.ObjectController.extend({
startEditing: function () {
//Create a new record on a local transaction
this.transaction = this.get('store').transaction();
this.set('model', this.transaction.createRecord(App.Author, {}));
},
save: function (author) {
//Local commit - author record goes in Flight state
author.get('transaction').commit();
//If response is success: didCreate fires
//Transition to edit of the new record
author.one('didCreate', this, function () {
this.transitionToRoute('author.edit', author);
});
//If response is 422 (validation problem at server side): becameError fires
author.one('becameInvalid', this, function () {
console.log "Validation problem"
});
}
...
2问题:
我想在“console.log”验证问题“'下面记录,这是服务器返回的完整错误列表。我怎样才能做到这一点 ?
在我的hbs模板中,我想指出相关字段旁边的错误。我怎样才能做到这一点 ?
我不确定通过REST适配器返回的数据是否正确。所以问题可能出在REST端或Ember端......
答案 0 :(得分:3)
解决方案:
在控制器保存功能中:
author.one('becameInvalid', this, function () {
console.log "Validation problem"
this.set('errors', this.get('content.errors'));
});
在hbs模板中:
{{view Ember.TextField valueBinding='name'}}
{{#if errors.name}}{{errors.name}}{{/if}}
答案 1 :(得分:1)
我是这样做的,可能不是最好的做法,但它对我有用:
而不是使用commit(),我使用save(),如果你想知道区别是什么,here就是链接。我没有尝试过使用事务的方法,但基本上我使用record = App.Model.createRecord(...)创建记录,这里是我在AddShopController中的apiAddShop函数的代码:
apiAddShop: function() {
//console.log("add shop");
newShop = App.Shop.createRecord({name:this.get('name'), currentUserRole:"owner"});
//this.get('store').commit(); // Use record.save() instead, then() is not defined for commit()
var self = this;
newShop.save().then(function(response){
self.transitionToRoute('shops');
}, function(response){
// if there is error:
// server should respond with JSON that has a root "errors"
// and with status code: 422
// otherwise the response could not be parsed.
var errors = response.errors;
for(var attr in errors){
if (self.hasOwnProperty(attr)) {
self.set(attr+"Error", true);
self.set(attr+"Message", Ember.String.classify(attr)+" "+errors[attr]);
}
console.log(attr + ': ' + errors[attr]);
}
console.log(response.errors.name[0]);
});
},
上面的代码假设表单中的每个属性都有attrError(boolean)和attrMessage(string)。然后在您的模板中,您可以将字段的类绑定到这些错误属性,例如<div {{bindAttr class=":control-group nameError:error:"}}>
,并且可以在表单字段旁边轻松显示错误消息,例如:<span {{bindAttr class=":help-inline nameError::hidden"}} id="new_shop_error">{{nameMessage}}</span>
这是我的示例车把gist(必须在这里使用gist,因为SO正在逃避我的html输入)。