jquery不调用$ .ajax for rails标准REST DELETE的成功方法

可能是这样的问题不是新的,但是我没有find类似的东西。 我有这样的jQuery代码:

$.ajax({ url : ('/people/'+id), type : 'DELETE', dataType : 'json', success : function(e) { table.getItems(currentPage); } }); 

我的Rails控制器看起来像这样:

 def destroy @person = Person.find(params[:id]) @person.destroy respond_to do |format| format.html { redirect_to(people_url) } format.json { render :json => @person, :status => :ok } end end 

这是工作。

但是,当我使用以下(由标准生成), successcallback不会被调用:

 def destroy @person = Person.find(params[:id]) @person.destroy respond_to do |format| format.html { redirect_to(people_url) } format.json { head :ok } end end 

rails 3.0.3jQuery 1.4.2Firefox 3.6.13下testing。
Firebug说,在两种情况下,查询都被触发并返回200 OK,两种情况下的项目也都被删除。 但在第二种情况下,不调用callback。

在REST中是否有显着的区别,有没有一种方法可以通过使用脚手架控制器来使用jQuery?

我已经跑了几次,答案看似简单。

您在$ .ajax调用中使用dataType : 'json' ,所以jQuery期待JSON响应。 有了head :ok Rails返回一个包含单个空格的响应( http://github.com/rails/rails/issues/1742),jQuery不接受它作为有效的JSON。;

所以,如果你真的希望得到一个错误或一个200 OK头,只要在你的请求中设置dataType : 'html' ,它应该工作(如果你不设置dataType,jQuery将尝试猜测是什么types基于响应头等,并仍然可以猜测JSON,在这种情况下,你仍然有这个问题)。 如果你真的希望得到JSON,而不是使用head :ok用JSON来渲染一个有效的东西(见注释),或者使用@Waseembuild议的head :no_content

GearHead是正确的,只不过jQueryparsing器实际上足够聪明,现在将空string响应视为null,而不是试图parsing它。

但是,如果您的电话有时会接收到json,有时会收到响应,并且您无法访问服务器或者不想更改所有head呼叫,则可以执行以下备用解决scheme:

问题是,当您使用head时,Rails发送一个单一的空间作为一个空的响应(请参阅: 如何返回在轨道真正的空体?即内容长度为0 )

在撰写本文时,jQuery parseJSON函数的相关部分如下所示:

 parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); } 

正如你所看到的,jQuery 修剪数据之前testing数据是否为空string。 然后尝试JSON.parse("") ,您可以在控制台中看到一个错误,通过catch语句触发ajax错误callback。

有一个简单的修复。 当一个数据types被请求并且返回一个不同的数据types时,jQuery允许你使用转换器。 请参阅这里了解更多详情: http : //api.jquery.com/extending-ajax/

由于rails head响应呈现为文本,因此您可以简单地将文本定义为json转换器,以在尝试parsing响应之前修剪响应。 只需添加这个片段:

 // deal with rails ' ' empty response jQuery.ajaxSetup({ converters: { "text json": function (response) { jQuery.parseJSON($.trim(response)) } } }) 

这有时是由旧版本的jQueryvalidation插件引起的。 如果你使用这个插件,这有时会导致这个问题。 有一个更新修复了这个问题,如果它适用于你的情况。

另外,你也可以通过设置一个error handling程序来判断出了什么问题:

$.ajaxSetup()$.ajaxError()

这可能会返回一个parsing错误。 jQuery的新版本因为对JSONparsing非常严格而臭名昭着。