1

我使用 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个问题:

  1. 我想在“console.log“验证问题”下面记录服务器返回的完整错误列表。我怎样才能做到这一点 ?

  2. 在我的 hbs 模板中,我想在相关字段旁边指出一个错误。我怎样才能做到这一点 ?

我不确定通过 REST 适配器返回的数据是否正确。所以问题可能出在 REST 端或 Ember 端......

4

2 回答 2

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}}
于 2013-08-08T22:05:57.953 回答
1

这是我的做法,可能不是最佳做法,但对我有用:

  1. 我没有使用 commit(),而是使用 save(),如果你想知道有什么区别,这里是链接。我没有尝试过使用事务的方法,但基本上我使用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]);
    });
    

    },

  2. 上面的代码假定表单中的每个属性都有一个 attrError(boolean) 和 attrMessage(string)。然后在您的模板中,您可以将字段的类绑定到这些错误<div {{bindAttr class=":control-group nameError:error:"}}>属性<span {{bindAttr class=":help-inline nameError::hidden"}} id="new_shop_error">{{nameMessage}}</span>,如因为 SO 正在逃避我的 html 输入)。

于 2013-08-30T06:10:47.943 回答