2013-12-18 52 views
1

比方說,我有一個Person模型規範化錯誤的有效載荷在灰燼

App.Person = DS.Model.extend 
    firstName: DS.attr 'string' 
    lastName: DS.attr 'string' 
    email: DS.attr 'string' 

我使用ember-data,呼喚使用下劃線的屬性名的REST API(即firstNamefirst_name),所以我定製ApplicationSerializer執行「全線」規範化(請參閱docs)。

App.ApplicationSerializer = DS.RESTSerializer.extend 
    keyForAttribute: (attr) -> 
    Ember.String.underscore(attr) 

這對串行化和規範化數據往返於服務器都很有效。但是,來自服務器的錯誤呢?

比方說,我有一個操作,試圖使用PUT來更新Person記錄。所以,我有按鈕

# Somewhere in the person/edit template 
<button {{action "save"}}>Save</button> 

而且控制器

App.PersonEditController = Ember.ObjectController.extend 
    actions: 
    save: -> 
     @get('model').save().then(@onDidCreate.bind(@)).fail(@onBecameError.bind(@)) 

    onBecameError: (res) -> 
    @get('model').set 'errors', res.responseJSON.errors 

但這種設置的下劃線的屬性名稱錯誤(即{first_name: ["can't be blank"]})。爲了顯示錯誤,我必須將我的視圖綁定到下劃線的屬性名稱。然後,我的觀點將會受到firstNamefirst_name屬性的約束。

如何使用相同的串行器來標準化錯誤負載以保持一致性?


編輯

而是重寫ajaxError鉤,最後我只是用ActiveModelSerializerActiveModelAdapter在他的回答中提到kingpin2k。這將標準化和序列化從下劃線屬性到camelCased屬性的數據和錯誤。

回答

0

重寫適配器上的ajaxError掛鉤,以下是活動模型適配器如何實現它。

App.ApplicationAdapter = DS.RESTAdapter.extend({ 
/** 
    The ActiveModelAdapter overrides the `ajaxError` method 
    to return a DS.InvalidError for all 422 Unprocessable Entity 
    responses. 

    @method ajaxError 
    @param jqXHR 
    @returns error 
    */ 
    ajaxError: function(jqXHR) { 
    var error = this._super(jqXHR); 

    if (jqXHR && jqXHR.status === 422) { 
     var jsonErrors = Ember.$.parseJSON(jqXHR.responseText)["errors"], 
      errors = {}; 

     forEach(Ember.keys(jsonErrors), function(key) { 
     errors[Ember.String.camelize(key)] = jsonErrors[key]; 
     }); 

     return new DS.InvalidError(errors); 
    } else { 
     return error; 
    } 
    } 

}); 

你的可能是相似的,但忽略了422

App.ApplicationAdapter = DS.RESTAdapter.extend({ 
/** 
    The ActiveModelAdapter overrides the `ajaxError` method 
    to return a DS.InvalidError for all 422 Unprocessable Entity 
    responses. 

    @method ajaxError 
    @param jqXHR 
    @returns error 
    */ 
    ajaxError: function(jqXHR) { 
    var error = this._super(jqXHR); 

    if (jqXHR) { 
     var jsonErrors = Ember.$.parseJSON(jqXHR.responseText)["errors"], 
      errors = {}; 

     forEach(Ember.keys(jsonErrors), function(key) { 
     errors[Ember.String.camelize(key)] = jsonErrors[key]; 
     }); 

     return new DS.InvalidError(errors); 
    } else { 
     return error; 
    } 
    } 

}); 
+0

我甚至不知道有一個'ActiveModelSerializer'。由於我使用Rails作爲後端,我將嘗試使用此適配器。它如何期待從服務器返回錯誤? – Feech

+0

https://github.com/emberjs/data/blob/master/packages/activemodel-adapter/lib/system/active_model_adapter.js – Kingpin2k

+0

我很確定你發送的格式是DS.ActiveModelAdapter – Kingpin2k