2011-10-06 81 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' 
}); 

数据类型文本不会被骨干后保存解析。

相关问题