使用RESTAdapter在Ember模型中未填充服务器端错误

时间:2016-10-17 08:38:14

标签: ember.js ember-data ember-cli

在尝试处理Ember应用程序中的服务器端错误时,我无法在模板中显示错误,因为模型未填充收到的错误。

使用的版本:
Ember-cli:2.4.3
灰烬数据:2.4.2
适配器:RESTAdapter

模板文件包含用户注册表单,如下所示:

    {{input type="text" value=username }}  
    {{#each model.errors.username as |error|}}  
         {{error.message}}  
    {{/each}}  
    {{input type="text" value=email }}  
    <button {{action 'register'}}>Register</button>  

routes文件包含用于保存用户的操作'register':

register: function(){  
    var username = this.controller.get('username');  
    var email = this.controller.get('email');  
    var user = this.store.createRecord('user',{  
            email: email,  
            username: username  
        });  
    user.save().then(function(){  
        //handle success  
     },function(error){  
       //handle error  
     });  
 }); 

模型如下:

export default Model.extend({  
    email: attr(),  
    username: attr()  
}); 

我正在使用的API以状态422响应并显示错误:

{    
   "errors":[  
      {  
         "detail":"can't be blank",
         "source":{  
            "pointer": "/data/attributes/username"
         }
      }
   ]
}  

根据DS.Errors的文档,可以通过访问其属性名称来显示错误,以获取该属性的所有错误对象的数组。这就是我在模板文件中尝试做的事情 此外,我尝试访问错误对象上的messages属性,但没有成功。

{{#each model.errors.messages as |message|}}
    {{message}}
{{/each}}

当我尝试在控制台上登录错误的长度属性,即

 user.save().then(function(){  
        //handle success  
     },function(error){  
       //handle error  
       console.log(user.get('errors.length'));
     }); 

它总是给我0.但是

console.log(user.get('errors.username.length'));  

给出了所需的输出,但仍然在模板中看不到错误 尝试覆盖RESTAdapter中的ajaxError,如本文24027053中所述,但没有运气 我不知道我做错了什么。请帮助!

3 个答案:

答案 0 :(得分:1)

我不知道这是否是最好的方式,但这对我有用:

        save(model) {
        model.save()
        .then(() => {
            console.log('success');
        })
        .catch(() => {
            if (model.get('errors.messages.length') > 0) {
                model.get('errors.messages').forEach((message) => {
                    console.log(message);
                });
            } else {
                console.log('failed');
            }
        });
    }

在模板中,我可以通过

访问错误
{{#each model.errors.messages as |error|}}
  <div class="error">
    {{error}}
  </div>
{{/each}}

答案 1 :(得分:0)

我认为错误在于:

user.save().then(function(){  
    //handle success  
 },function(error){  
   //handle error  
   console.log(user.get('errors.length'));
 }); 

用户未保存,因此没有错误。试试这个:

 user.save().then(function(){  
    //handle success  
 },function(error){  
   //handle error --> how do you handle it? Are you maybe overriding the default behaviour?
   // you might want to put a 'debugger;' statement here in order to see, what the response actually looks like  
   console.log(error.errors);
 }); 

答案 2 :(得分:0)

通过设置包含错误的模型解决了问题。看起来DS.Errors在填充错误后没有设置模型。

现在我的注册功能如下:

var route = this;
user.save().then(function(){  
        //handle success  
     },function(error){  
       var errors = user.get('errors');
       route.set('_model.errors',errors);
     });

并且路径文件中的模型钩子是:

_model:{},
model(){
return this.get('_model');
}

注册函数使用错误填充_model,模型钩子返回_model,以便在视图中可用。