2013-07-09 33 views
0

我想創建一個記錄,並在服務器端我使用rails。 rails驗證失敗,我返回一個422狀態碼,但是當我在becomeInvalid回調中刪除它時,它不會從模板中刪除。它只是顯示一個空白條目。Ember刪除無效的服務器驗證記錄

當它正在等待服務器加載它只是顯示名稱,這是預期的。

灰燼型號代碼

App.Job = DS.Model.extend({ 
    name : DS.attr("string"), 
    user : DS.belongsTo("App.User", {embedded : "load"}), 
    plans : DS.hasMany("App.Plan", {embedded : "load"}), 
    shares : DS.hasMany("App.Share", {embedded : "load"}), 

    becameInvalid : function(data){ 
    this.deleteRecord(); 
    } 
}); 

灰燼控制器通話

PlanSource.Job.createRecord({"name" : name}); 
job.save(); 

Rails的創建方法

def create 
    if can? :create, Job 
    @job = Job.new(name: params["job"]["name"], user_id: current_user.id) 
    if [email protected] 
     render :json => {job: @job}, status: :unprocessable_entity 
     return 
    end 
    if 
     render :json => {:job => @job}, include: [:plans, :user, :shares => {except: :token, include: [:user, :job]}] 
    else 
     render_no_permission 
    end 
    else 
    render_no_permission 
    end 
end 

我的問題是什麼是處理服務器端驗證錯誤的最好方式。我不想嘗試重新提交記錄,我只是想刪除它。我正在尋找一些東西讓Ember等待服務器響應,但什麼都沒發現。

此方法不起作用,因爲它會在刪除後在模型管道中導致未定義的錯誤。

回答

2

我的問題是處理服務器端驗證錯誤的最佳方法是什麼。

不確定是否有最佳的方法。取決於你想在你的UI中發生什麼。通常情況下,您會希望讓用戶知道該記錄未保存,並提供出錯信息。

我不想嘗試重新提交記錄,我只是想刪除它。

好的。如果記錄是新的,刪除沒有意義,但可能你想要做的是回滾事務嗎?嘗試this.transaction.rollback()this.rollback()。例如:

App.Job = DS.Model.extend({ 
    name : DS.attr("string"), 
    user : DS.belongsTo("App.User", {embedded : "load"}), 
    plans : DS.hasMany("App.Plan", {embedded : "load"}), 
    shares : DS.hasMany("App.Share", {embedded : "load"}), 

    becameInvalid : function(data){ 
    this.transaction.rollback(); 
    } 
}); 

參見:How to deleteRecord when it was never committed on the backend?

我一直在尋找的東西,使灰燼等待服務器的響應,但一無所獲。

model.save()返回承諾。這意味着您可以添加成功/失敗處理程序,如下所示:

PlanSource.Job.createRecord({"name" : name}); 
var success = function(model) { 
    alert('ok'); 
}; 
var failure = function(model) { 
    alert('fail'); 
}; 
job.save().then(success, failure);