2015-09-30 9 views
6

configurazionebackend di convalida con RESTAdapter sempre "L'adattatore ha respinto il commit perché era valido"

  • backend = laravel 5.1, con Dingo API
  • Frontend = Ember 1.13.6, Ember dati 1.13. 7
  • Adapter = Ember dati RESTAdapter

Il problema

Sto provando a gestire gli errori di convalida del backend sulla mia prima applicazione Ember. Quando gli errori vengono restituiti dal server, ottengo questo errore:

Error: The adapter rejected the commit because it was invalid 
at new Error (native) 
at Error.EmberError (http://localhost:4200/assets/vendor.js:26266:21) 
at Error.ember$data$lib$adapters$errors$$AdapterError (http://localhost:4200/assets/vendor.js:69564:50) 
at Error.ember$data$lib$adapters$errors$$InvalidError (http://localhost:4200/assets/vendor.js:69637:52) 
at ajaxError (http://localhost:4200/assets/frontend.js:16:24) 
at ember$data$lib$system$adapter$$default.extend.ajax.Ember.RSVP.Promise.hash.error (http://localhost:4200/assets/vendor.js:71327:31) 
at jQuery.Callbacks.fire (http://localhost:4200/assets/vendor.js:3350:30) 
at Object.jQuery.Callbacks.self.fireWith [as rejectWith] (http://localhost:4200/assets/vendor.js:3462:7) 
at done (http://localhost:4200/assets/vendor.js:9518:14) 
at XMLHttpRequest.jQuery.ajaxTransport.options.send.callback (http://localhost:4200/assets/vendor.js:9920:8) 

La risposta da parte del back-end ha un'intestazione 422 Unprocessable entità, e il contenuto è:

{ 
    "message":"Couldn't save client", 
    "errors":{ 
      "name":["The name field is required."], 
      "email":["The email field is required."] 
     }, 
    "status_code":422 
} 

provato (e fallito) soluzioni

  • Ember data Rest adapter error handling not working
    Estendere il RESTAdapter per o verride la funzione ajaxError, miniera attualmente appare così:

    ajaxError: function(jqXHR) { 
    var error = this._super(jqXHR); 
    if (jqXHR && jqXHR.status === 422) { 
        var jsonErrors = Ember.$.parseJSON(jqXHR.responseText).errors; 
        return new DS.InvalidError(jsonErrors); 
    } else { 
        return error; 
    } 
    } 
    
  • Aggiunta di un'istruzione catch per il metodo di salvataggio, il mio salvare l'azione è attualmente:

    save() { 
        var self = this; 
    
        function transitionToPost(post) { 
         self.transitionToRoute('clients.show', post); 
        } 
    
        function failure(reason) { 
         // handle the error 
         console.log(reason); 
         return false; 
        } 
    
        this.get('model').save().then(transitionToPost, failure).catch(failure); 
    } 
    
  • testare l'ActiveModelAdapter - non so cosa Mi aspettavo di ottenere questo, ma mi sono disperata; il risultato era sempre lo stesso.

  • Ember Docs (http://guides.emberjs.com/v1.13.0/models/creating-updating-and-deleting-records/#toc_promises)
    Come si può vedere nel mio codice di controllo di cui sopra, in realtà ho usato questo come base

prega si può avere uno sguardo e consigliare? Grazie in anticipo per qualsiasi aiuto!

+0

OK, così ho disinstallato i dati di ember e reinstallato e poi tutto ha iniziato a funzionare correttamente! – AshleyVee

risposta

0

mio app/adapters/application.js:

export default DS.RESTAdapter.extend({ 
    ajaxError(jqXHR) { 
    var error, errors, jsonErrors, response; 
    error = this._super(jqXHR); 

    if (jqXHR && jqXHR.status === 422) { 
     response = Ember.$.parseJSON(jqXHR.responseText); 
     errors = {}; 
     if (response.errors != null) { 
     jsonErrors = response.errors; 
     Ember.keys(jsonErrors).forEach(function(key) { 
      return errors[Ember.String.camelize(key)] = jsonErrors[key]; 
     }); 
     } 
     return new DS.InvalidError(errors); 
    } else { 
     return error; 
    } 
    } 
}); 

In combinazione con l'abitudine ServerErrorsMixin per i modelli:

export default Ember.Mixin.create({ 
    isntValid: Ember.computed.not('isValid').readOnly(), 

    adapterDidInvalidate(errors) { 
    let recordErrors = this.get('errors'), 
     hasProp = {}.hasOwnProperty; 

    for (let key in errors) { 
     if (!hasProp.call(errors, key)) { 
     continue; 
     } 

     let propertyErrors = errors[key]; 

     if(key === 'duplicate') { 
     if(!Ember.isArray(propertyErrors)) { 
      recordErrors 
      .get('messages') 
      .pushObject(propertyErrors); 
     } else { 
      Ember.debug('It shouldnt be an array.'); 
     } 
     } else { 
     for (let e of propertyErrors) { 
      recordErrors 
      .get(key) 
      .pushObject(e); 
     } 
     } 
    } 

    this._saveWasRejected(); 
    } 
}); 

funziona bene in Ember dati 1.0.0-beta.18. Se si prova questo, si prega di estendere da ServerErrorsMixin nel modello:

import ServerErrorsMixin from '../mixins/server-errors'; 

export default DS.Model.extend(ServerErrorsMixin, { 
    // ... 
}) 
+0

Ho appena provato questo esattamente come hai descritto, ma sto ancora ricevendo lo stesso errore. Sicuramente sta colpendo il metodo ajaxError, ho console registrato gli errori a quel punto, ma non colpisce mai "adapterDidInvalidate" nel mixin, che ora ho usato nel mio modello. – AshleyVee