也许这样的问题并不新鲜,但我没有找到任何类似的东西。我有这样的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
回调不会被调用:
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说,该查询被触发并在两种情况下都返回200OK,项目在这两种情况下也被删除。但在第二种情况下,回调不会被调用。
REST有显著的区别吗?有没有办法通过使用脚手架控制器来利用jQuery?
发布于 2011-04-13 09:44:50
我已经遇到过这个问题几次了,答案看起来很简单。
您在$.ajax调用中使用了dataType : 'json'
,因此jQuery期望得到JSON响应。With JSON Rails返回一个包含单个空格(http://github.com/rails/rails/issues/1742)的响应,这不被jQuery接受为有效的head :ok
。
因此,如果你真的希望得到一个错误或者一个空的200OK头,只要在你的请求中设置dataType : 'html'
,它就会工作(如果你没有设置dataType,jQuery将尝试根据响应头等猜测类型,并仍然可以猜测json,在这种情况下,你仍然会有这个问题)。如果您真的希望得到JSON,那么不要使用head :ok
来呈现一些有效的JSON (参见注释),或者像@Waseem建议的那样使用head :no_content
发布于 2011-03-16 22:00:23
这有时是由旧版本的jQuery验证插件引起的。如果你正在使用这个插件,这有时会导致这个问题。有一个更新可以修复这个问题,如果它适用于您的案例。
或者,您可以通过以下方式设置错误处理程序来找出问题所在:
$.ajaxSetup()
或$.ajaxError()
这可能会返回一个解析错误。新版本的jQuery因对JSON解析非常严格而臭名昭著。
https://stackoverflow.com/questions/4791499
复制相似问题