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
这是工作。
但是,当我使用以下(由标准生成), success
callback不会被调用:
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.3
, jQuery 1.4.2
和Firefox 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非常严格而臭名昭着。