2013-10-24 30 views
6

Có cách nào thích hợp để xử lý lỗi tùy chỉnh khi lưu mô hình không? Để đưa ra một ví dụ, hãy nói rằng tôi có một mô hình chỉ với hai thuộc tính "name" và "value". Và khi tôi làm:đang xử lý lỗi máy chủ tùy chỉnh trong dữ liệu ember khi lưu mô hình có thể

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 

}); 

Một cách để giải quyết vấn đề này là gọi thêm ajax để kiểm tra xem tên có duy nhất không và sau đó thực hiện lưu. Tôi chỉ tự hỏi phương pháp tốt nhất/thanh lịch ở đây là gì.

Cảm ơn, Dee

EDIT: tôi nghĩ rằng nó có thể giúp một chút để cho thêm ngữ cảnh về phía máy chủ trong những điều trong groovy. Vì vậy, đây đó là:

Trong điều khiển của tôi, tôi có:

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

} 

Sau đó, trong điều khiển ember của tôi:

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

Trả lời

7

deleteRecord sẽ xóa hồ sơ.

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

}); 
+0

Cảm ơn. Ban đầu tôi đã gặp vấn đề với cách để có được response.error nhưng sau đó tôi đã tìm ra cách gửi văn bản phản hồi với mã lỗi HTTP thích hợp và nhận được responseText thay thế. –

+2

Đó là cách tôi làm cho thời điểm này nhưng tôi không thích nó bắt đầu hiển thị bản ghi và xóa nó sau khi máy chủ trả lời. Có cách nào để chờ câu trả lời của máy chủ để hiển thị bản ghi đã lưu không? – Bachet

0

Tại sao không phải là câu trả lời là để chỉ cần sử dụng: DS.ERRORS CLASS ?

Từ EmberJS tài liệu:

Ví dụ, nếu bạn đã có một mô hình người dùng mà trông như thế này:

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

Và bạn đã cố gắng tiết kiệm một kỷ lục mà không xác nhận trên backend.

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

Cửa hàng dữ liệu phụ trợ của bạn có thể trả về phản hồi giống như thế này. Phản hồi này sẽ được sử dụng để điền đối tượng lỗi.

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

Lỗi có thể được hiển thị cho người dùng bằng cách truy cập tên thuộc tính hoặc sử dụng thuộc tính thư để nhận một mảng lỗi.

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

Câu hỏi này chỉ tập trung vào xác thực vào mô hình? so với persistence/save nó, do đó dữ liệu được làm sạch trước khi nó chạm vào một kho dữ liệu ... Có vẻ như bạn vẫn muốn quản lý lỗi ở cấp lưu trữ dữ liệu adapter.

Điều đó tất cả đã nói, tại sao bạn không chỉ sử dụng mẫu hoặc xác thực JS dựa trên bình thường ở cấp điều khiển giao diện người dùng?

+0

Câu hỏi nảy sinh vì tôi không biết cách lấy các lỗi phía máy chủ có thể xuất hiện khi lưu câu hỏi. Có, chúng tôi xác nhận mô hình trước khi chúng tôi lưu mô hình, nhưng đôi khi máy chủ có thể bị hỏng hoặc có xác thực nhất định chỉ có thể thực hiện ở cấp máy chủ (chẳng hạn như kiểm tra tính duy nhất v.v.) và chúng tôi chỉ muốn hiển thị các lỗi đó trong Giao diện người dùng. Tôi hiện đang làm một cái gì đó rất giống với những gì bạn đã gợi ý - để tất cả các lỗi phía máy chủ và lỗi phía máy khách luôn được đẩy vào cùng một mảng và không cần phải thay đổi nhiều trong giao diện người dùng để hiển thị lỗi. Cảm ơn. –

+0

Tôi hiểu ... Kiến trúc phía máy chủ của bạn là gì? Nó có phải là môi trường Ruby on Rails với một cơ sở dữ liệu dựa trên kiểu sql mà cuối cùng tất cả dữ liệu đang được lưu trữ? Hoặc một cái gì đó đơn giản hơn - Rest -> Firebase? – DavidK

+0

Đây là nơi văn bản trên xuất phát từ http://emberjs.com/api/data/classes/DS.Errors.html – artburkart

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