jquery没有';t调用$.ajax for rails标准REST删除答案上的success方法

jquery没有';t调用$.ajax for rails标准REST删除答案上的success方法,jquery,ruby-on-rails,rest,Jquery,Ruby On Rails,Rest,可能这样的问题并不新鲜,但我没有发现任何类似的问题。我有这样的jQuery代码: $.ajax({ url : ('/people/'+id), type : 'DELETE', dataType : 'json', success : function(e) { table.getItems(currentPage); } }); 我的Rails控制器如下所示: def destroy @person = Person.find(params[:i

可能这样的问题并不新鲜,但我没有发现任何类似的问题。我有这样的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
这是有效的

但是当我使用以下命令(由standard生成)时,
success
回调不会被调用:

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
下测试
Firebug说,在这两种情况下,该查询被激发并返回200 OK,在这两种情况下,该项也被删除。但在第二种情况下,不调用回调


REST是否存在显著差异,是否有一种方法可以通过使用脚手架控制器来利用jQuery?

这有时是由jQuery验证插件的旧版本造成的。如果您使用此插件,有时会导致此问题。如果适用于您的案例,则有一个更新可以修复此问题

或者,您也可以通过以下方式设置错误处理程序来找出问题所在:

$.ajaxSetup()
$.ajaxError()


这可能会返回一个分析错误。jQuery的较新版本因对JSON解析非常严格而臭名昭著。

我已经遇到过几次了,答案似乎很简单

您在$.ajax调用中使用了
dataType:'json'
,因此jQuery需要一个json响应。With
head:ok
Rails返回一个包含单个空格()的响应,jQuery不接受该空格作为有效的JSON


因此,如果您确实希望得到一个错误或一个简单的200 OK头,只需在您的请求中设置
数据类型:“html”
,它就会工作(如果您没有设置数据类型,jQuery将尝试根据响应头等猜测类型,并且仍然可以猜测json,在这种情况下,您仍然会遇到这个问题)。如果你真的希望拿回JSON,而不是使用
head:ok
用JSON呈现一些有效的东西(见注释),或者只使用@Waseem

建议的
head:no\u content
,这是正确的,除了jQuery解析器现在已经足够聪明,可以将空字符串响应视为null,而不尝试解析它

但是,如果您的调用有时会收到json,有时会收到
head
响应,并且您没有访问服务器的权限,或者不想更改所有
head
调用,则可以执行以下替代解决方案:

问题是,当您使用
head
时,Rails会发送一个空格作为空响应(请参见此处:)

在撰写本文时,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在修剪数据之前正在测试数据是否为空字符串。然后它尝试
JSON.parse(“”
,您可以在控制台中看到它导致错误,通过
catch
语句触发ajax错误回调

有一个简单的解决方法。jQuery允许您在请求一种数据类型并返回另一种数据类型时使用转换器。有关更多详细信息,请参见此处:

由于rails
head
response呈现为文本,因此您可以简单地定义一个text-to-json转换器,该转换器将在尝试解析响应之前对响应进行修剪。只需添加以下代码段:

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

两个请求都返回有效的JSON吗?你能用Charles嗅嗅一下吗,或者用curl手动点击一下,看看会有什么结果?你的url中缺少一个引号。。以防万一。当我为一个问题准备代码时,出现了missing qoute:)dorkitude,正如我所知,在第二种方法中,它返回的答案是空的,只有200个OK头,这是推荐的休息方式。第一种方法返回有效的JSON,但不建议对资源删除REST请求使用这种答案。在这个副本中有一个很好的答案,不,我没有使用任何jQuery插件(除了我自己编写的一些插件,但它们对ajax没有影响)。我知道,在所描述的情况下,服务器返回空答案,而jquery可能无法解析它。我想知道是否有一种很好的方法可以让它使用这个空答案。我假设任何无法解析的东西,包括空答案,都会触发ajaxError回调,因此您可以在那里为它设置一个处理程序。在这种情况下,您会如何返回失败?更好的方法是使用
head:no_content
。See和我也有类似的问题,因为rails表单(simple_表单)中缺少数据类型。本以为我会交叉引用这个线程,它是由
{:'data-type'=>:json},:remote=>true do | f |%>
解决的,直到我通过@AshBlue返回一个hash:json as so:json=>{'message'=>'delete completed'}作为@json返回一个字符串时,它才对我起作用。最后,我返回了nil,状态代码为:
render json:nil,status::ok
FYI,
jQuery.parseJSON
只是一个,它在空字符串上抛出一个异常(“输入意外结束”)。因此,这应该明确检查空响应(
$.trim(response).length==0
)和
返回null