为什么我的Backbone.js错误回调被调用,即使Rails应该返回成功响应?

时间:2011-10-06 01:24:21

标签: javascript backbone.js coffeescript

我正在使用Backbone.js(版本0.5.3),并且在saving a model时遇到成功回调问题。即使模型已成功保存在服务器上,它也不会被运行。

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请求:

enter image description here

2 个答案:

答案 0 :(得分:12)

我遇到过这种情况。您不能只返回head :ok并使用Backbone的默认行为。默认的Backbone.Sync不会有它。

首先,如果您在create行动中执行此操作,您将永远不会知道您的id是什么,因此模型以后无法更新(您是做,因为“PUT”)。

其次,在您的update操作中,如果您返回head :ok,模型将不会知道数据真正同步,因此同步再次失败。但如果您没有id,则无关紧要。

无论如何,你需要在体内归还一些东西。

默认情况下,Rails脚手架在成功head :ok后返回update。这与Backbone没有关系。要修复它,请改为返回JSON:

render json: @entity

(其中@entity是您的变量在动作中的任何内容)

答案 1 :(得分:0)

Backbone期望来自服务器的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'
});

保存后,Backbone不会解析数据类型 text