2015-09-30 16 views
6

Cấu hìnhBackend Validation với RESTAdapter luôn "Các bộ chuyển đổi từ chối cam kết bởi vì nó không hợp lệ"

  • Backend = Laravel 5.1, với Dingo API
  • Frontend = Ember 1.13.6, Ember liệu 1,13. 7
  • Adaptor = Ember liệu RESTAdapter

vấn đề

Tôi đang cố gắng xử lý lỗi xác thực phụ trợ trên ứng dụng Ember đầu tiên của mình. Khi lỗi được trả về từ máy chủ, tôi nhận được lỗi này:

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) 

Các phản hồi từ backend có một tiêu đề 422 Không thể xử Entity, và nội dung là:

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

Cố gắng (và thất bại) giải pháp

  • Ember data Rest adapter error handling not working
    Mở rộng RESTAdapter để o verride chức năng ajaxError, mỏ hiện trông như thế này:

    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; 
    } 
    } 
    
  • Thêm một lệnh catch với phương pháp tiết kiệm, tôi lưu hành động hiện là:

    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); 
    } 
    
  • Testing ra ActiveModelAdapter - không chắc chắn những gì Tôi đã mong đợi để đạt được điều này, nhưng tôi đã tuyệt vọng; kết quả vẫn như cũ.

  • Ember Documents (http://guides.emberjs.com/v1.13.0/models/creating-updating-and-deleting-records/#toc_promises)
    Như bạn thấy trong mã điều khiển của tôi ở trên, tôi thực sự sử dụng điều này như một cơ sở

Xin vui lòng bạn có thể có một cái nhìn và tư vấn? Cảm ơn trước sự giúp đỡ nào!

+0

OK, vì vậy tôi đã gỡ cài đặt dữ liệu ember và cài đặt lại và sau đó mọi thứ bắt đầu hoạt động bình thường! – AshleyVee

Trả lời

0

My 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; 
    } 
    } 
}); 

Kết hợp với tùy chỉnh ServerErrorsMixin cho các mô hình:

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(); 
    } 
}); 

trình tốt trong Ember liệu 1.0.0-beta.18. Nếu bạn cố gắng nhớ, hãy nhớ mở rộng từ ServerErrorsMixin trong mô hình:

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

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

Tôi vừa thử chính xác như bạn đã mô tả, nhưng tôi vẫn gặp lỗi tương tự. Nó chắc chắn nhấn phương pháp ajaxError, tôi đã giao diện điều khiển đăng nhập các lỗi tại thời điểm đó, nhưng nó không bao giờ chạm vào "adapterDidInvalidate" trong mixin, mà tôi đã sử dụng trong mô hình của mình. – AshleyVee

Các vấn đề liên quan