2011-10-06 57 views
7

我正在使用Backbone.js(版本0.5.3),並且在saving a model時遇到了一些成功回調的問題。即使模型已成功保存在服務器上,它仍未運行。爲什麼我的Backbone.js錯誤回調被調用,即使Rails應該返回成功響應?

的CoffeeScript:

console.log 'in switch_private' 
console.log "private_entry attribute is currently #{@model.get('private_entry')}" 
@model.save {'private_entry': true}, 
    success: -> 
    console.log 'in success' 

編譯的JavaScript:

console.log('in switch_private'); 
console.log("private_entry attribute is currently " + (this.model.get('private_entry'))); 
return this.model.save({ 
    'private_entry': true 
}, { 
    success: function() { 
    return console.log('in success'); 
    } 
}); 

控制檯輸出:

in switch_private 
private_entry attribute is currently false 
XHR finished loading: "http://localhost:3000/entries/235". 

我從Ruby on Rails中的更新操作返回head :ok

添加模型和響應參數,使其爲success: (model, response) ->,沒有什麼區別。出了什麼問題?

編輯: 根據Trevor Burnham的建議,我添加了一個錯誤回調,它正在運行。那麼我應該從Ruby on Rails操作中返回什麼,以便Backbone考慮保存成功?目前,我有head :ok

編輯2:這裏是我的最新編譯的JavaScript:

var this_view; 
this_view = this; 
return this.model.save({ 
    'private_entry': !(this.model.get('private_entry')) 
}, { 
    success: function(model, response) { 
    return console.log('in success'); 
    }, 
    error: function(model, response) { 
    return console.log('in error'); 
    } 
}); 

這裏是PUT請求:

​​3210

+1

如果你添加一個'error'回調函數呢?它會被叫嗎? –

+0

感謝您的建議,我編輯了這個問題。 – ben

+0

我編輯了問題標題。你可能想重寫它比這更好:/ – hugomg

回答

12

我已經運行到這一點。您不能僅返回head :ok並使用Backbone的默認行爲。默認的Backbone.Sync不會擁有它。

首先,如果您在create操作中執行此操作,您將不會知道您的id是什麼,因此該模型將不能在以後更新(您正在操作,因爲「PUT 「)。

其次,在您的update操作中,如果您返回head :ok以使同步再次失敗,則該模型不會知道數據是否真正同步。但如果你沒有id就沒關係。

無論如何,你需要返回一些內容。

默認情況下,導軌腳手架在成功返回head :okupdate。這不會與Backbone混淆。爲了解決這個問題,返回JSON來代替:

render json: @entity 

(其中@entity是不管你的變量是在動作)

+0

它現在工作,感謝您的幫助! – ben

0

骨幹從服務器預計JSON,並配有文字的服務器返回。

要在客戶端解決這個問題,數據類型設置爲文本代替JSON,並且服務器期待內容類型爲JSON

options.contentType = 'application/json'; 
options.dataType = 'text'; 

你更新後的代碼如下,

return this.model.save({'private_entry': !(this.model.get('private_entry'))}, { 
    success: function(model, response) { 
     return console.log('in success'); 
    }, 
    error: function(model, response) { 
     return console.log('in error'); 
    }, 
    contentType : 'application/json', 
    dataType : 'text' 
}); 

數據類型文本不會被骨幹後保存解析。

相關問題