骨干model.destroy()调用错误callback函数,即使它工作正常?

我有一个Backbone.js模型,当用户点击模型视图中的链接时,我试图销毁它。 该视图是这样的(伪代码,因为它在CoffeeScript中实现,可以在问题的底部find)。

var window.ListingSaveView = Backbone.View.extend({ events: { 'click a.delete': 'onDestroy' }, onDestroy: function(event){ event.preventDefault(); this.model.destroy({ success: function(model, response){ console.log "Success"; }, error: function(model, response){ console.log "Error"; } }); } }); 

当我单击浏览器中的delete链接时,即使我的服务器logging成功销毁关联的数据库logging并返回200响应,我总是会将Errorlogging到控制台。 当我刷新页面(导致集合重新从数据库呈现)我删除的模型将消失。

有趣的是,当我在错误callback中loggingresponse时,它的状态码200表示成功,但是它也会报告statusText: "parseerror" 。 我的服务器日志中没有错误。

我究竟做错了什么?

这是来自服务器的响应:

  Object abort: function ( statusText ) { always: function () { complete: function () { done: function () { error: function () { fail: function () { getAllResponseHeaders: function () { getResponseHeader: function ( key ) { isRejected: function () { isResolved: function () { overrideMimeType: function ( type ) { pipe: function ( fnDone, fnFail ) { promise: function ( obj ) { readyState: 4 responseText: " " setRequestHeader: function ( name, value ) { status: 200 statusCode: function ( map ) { statusText: "parsererror" success: function () { then: function ( doneCallbacks, failCallbacks ) { __proto__: Object 

这里是销毁交互的服务器动作(Ruby on Rails)

  # DELETE /team/listing_saves/1.json def destroy @save = current_user.team.listing_saves.find(params[:id]) @save.destroy respond_to do |format| format.json { head :ok } end end 

下面是实际的Backbone View的CoffeeScript实现,对于喜欢它的人来说:

 class MoveOutOrg.Views.ListingSaveView extends Backbone.View tagName: 'li' className: 'listing_save' template: JST['backbone/templates/listing_save'] events: 'click a.delete_saved': 'onDestroy' initialize: -> @model.bind 'change', this.render render: => renderedContent = @template(@model.toJSON()) $(@el).html(renderedContent) this onDestroy: (event) -> event.preventDefault() # stop the hash being added to the URL console.log "Listing Destroyed" @model.destroy success: (model, response)-> console.log "Success" console.log model console.log response error: (model, response) -> console.log "Error" console.log model # this is the ListingSave model console.log response 

@大卫Tuite评论:

“好吧,我想明白了,似乎Backbone希望JSON响应是被破坏的logging的JSON序列化,然而,Rails控制器生成器只返回头:默认情况下,我改变了我的JSON响应是渲染json: @listing_save其中@listing_save是我刚刚销毁的logging,它注册成功。

仅供参考 – 当你正在销毁时,你不需要为已销毁的模型返回完整的json。 你可以返回一个空的json散列,它会工作得很好。 唯一需要返回模型的json的时候是保存/更新。

我有这个相同的问题。 在我的服务器上的删除方法(Java),我没有返回任何东西。 只是状态200 / OK(或204 /无内容)。 所以“parsererror”问题是由jquery试图将空响应转换为JSON,失败(因为“json”是默认数据types)引起的。

我的解决scheme是使用“文本”数据types,可以在选项中设置:

 model.destroy({ dataType: "text", success: function(model, response) { console.log("success"); }}); 

您的回复必须有状态码204,因为您不会返回任何内容。 由于主干使用REST接口,因此根据任务的不同,应该返回不同的http状态码。

你确定你的url吗? 你是否在Backbone.Model url的末尾附加了一个.json ? 由于您在服务器端检查了这个(respond_to do | format | … end),您可能不会发送正确的head :ok响应

试试这个destroy轨道方法来testing这是否是问题:

 def destroy @save = current_user.team.listing_saves.find(params[:id]) @save.destroy head :ok end 

在LAMP服务器上使用Slim Framework,可以将响应状态添加到DELETE路由(或不返回任何内容的自定义路由)

$app->response()->status(204);//204 No Content

这也将Content-Type重新设置为text / html,以允许空的正文