is handling custom server side errors in ember-data when saving model possible

与世无争的帅哥 提交于 2019-12-21 04:52:09

问题


Is there proper way to handle custom error when saving a model? To give an example, lets say I have a model with just two properties "name" and "value". And when I do :

var myModel = this.get('store').createRecord('myModel', {"name": "someName", "value": "someValue"});
myModel.save().then(function() {
    //if success
    //server responded with {"myModel:{"id":1,"name":"someName","value":"someValue"}"}
},function() {
    //if failure
    //server responded with {"error":"some custom error message"}
    //BUT HOW TO CATCH THIS AND POSSIBLY REMOVE THE MODEL FROM THE STORE

});

One way to work around this is to make extra ajax call to check if the name is unique and then do the save. I am just wondering what is the best/elegant approach here.

Thanks, Dee

EDIT : I thought it might help a bit to give more context on the server side of the things in groovy. So here it is:

In my controller I have :

def create() {

    try {
        newRow = someService.create(params)
        render someService.list(newRow) as JSON//returns data in format needed by ember-data
    }
    catch (ValidationException ex) {
        def errors = ["errors":[]]

        ex.errors.allErrors.each{
            if(it.arguments[0] == "fieldName" && it.code=="constrantViolated"){
                errors.errors.push(["field":it.arguments[0],"message":"some custom message"])
            }
        }
        //I am using 422 here because of post in http://stackoverflow.com/questions/7996569/can-we-create-custom-http-status-codes
        render(status: 422, contentType: 'JSON', text: (errors as JSON))
    }

}

Then in my ember controller:

    var myModel = self.get('store').createRecord('myModel ', myModelDataInJSON);
myModel .save().then(function () {
        //if success
                },
    function (response) {
        myModel .deleteRecord();
        var errors = $.parseJSON(response.responseText);
        for (var key in errors.errors) {
            //do something
        }
    });

回答1:


deleteRecord will delete the record.

myModel.save().then(function(response) {
  //if success
  //server responded with {"myModel:{"id":1,"name":"someName","value":"someValue"}"}
},function(response) {
  //if failure
  //server responded with {"error":"some custom error message"}
  //BUT HOW TO CATCH THIS AND POSSIBLY REMOVE THE MODEL FROM THE STORE
  if(response.error=='no good'){
    myModel.deleteRecord();
  }

});



回答2:


You can handle errors at model by adding properties into your model:

becameError: ->
  # handle error case here
  alert 'there was an error!'

becameInvalid: (errors) ->
  # record was invalid
  alert "Record was invalid because: #{errors}"

Check: How should errors be handled when using the Ember.js Data RESTAdapter?




回答3:


Why wouldn't the answer be to just use the: DS.ERRORS CLASS?

From EmberJS docs:

For Example, if you had an User model that looked like this:

App.User = DS.Model.extend({ username: attr('string'), email: attr('string') });

And you attempted to save a record that did not validate on the backend.

var user = store.createRecord('user', {
  username: 'tomster',
  email: 'invalidEmail'
});
user.save();

Your backend data store might return a response that looks like this. This response will be used to populate the error object.

{
  "errors": {
    "username": ["This username is already taken!"],
    "email": ["Doesn't look like a valid email."]
  }
}

Errors can be displayed to the user by accessing their property name or using the messages property to get an array of all errors.

{{#each errors.messages}}
  <div class="error">
    {{message}}
  </div>
{{/each}}

Is this question only focused on validation into the model? versus persistence/saving it, hence data is clean already before it hits a data store... Seems like you would still want error management at the adapter data store level, too.

That all said, why wouldn't you just use template or normal based JS validation at the UI control level?



来源:https://stackoverflow.com/questions/19574133/is-handling-custom-server-side-errors-in-ember-data-when-saving-model-possible

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!