当前位置: 首页 > 面试题库 >

rails3 rails.js和jquery捕获ajax请求的成功和失败

孙风畔
2023-03-14
问题内容

以前,在Rails 2.3.8中,我使用了原型帮助器link_to_remoteform_remote_for(以及其他)。

这些选项:update如下:

link_to_remote "Add to cart",
  :url => { :action => "add", :id => product.id },
  :update => { :success => "cart", :failure => "error" }

(来自文档的示例)。此示例将在成功后用类“
cart”更新html元素,而在失败时将类“ error”更新。

现在我相信操作方式已经改变,我们写:

link_to "Add to cart", :url => {:action => "add", :id => product.id}, 
    :remote => true

并且没有设置选项:update了。现在,代替普通的html,我们渲染javascript,如下所示(在jquery中):

$('.cart').replaceWith(<%= escape_javascript(render :partial => 'cart') %>)

但是您如何处理错误情况?我可以在控制器中处理它,并使用单独的视图吗?

以某种方式模仿我们以前的行为对我来说似乎很有用。有任何想法吗?


问题答案:

哈!我发现它在描述这个文章。在rails.js中,检查了以下回调:

  • ajax:loading:在执行AJAX请求之前触发
  • ajax:success:成功的AJAX请求后触发
  • ajax:complete:在AJAX请求完成后触发,无论响应状态如何
  • ajax:failure:在AJAX请求失败后触发,与ajax:success相反

由于javascript的语言不容干扰,因此在HTML中不会进行这种耦合。

一个示例(来自同一站点):以下Rails 2.3.8

<% form_remote_tag :url => { :action => 'run' },
        :id => "tool-form",
        :update => { :success => "response", :failure => "error" },
        :loading => "$('#loading').toggle()", :complete => "$('#loading').toggle()" %>

被翻译成这样:

<% form_tag url_for(:action => "run"), :id => "tool-form", :remote => true do %>

然后在一些javascript(application.js)中,将事件绑定

jQuery(function($) {
  // create a convenient toggleLoading function
  var toggleLoading = function() { $("#loading").toggle() };

  $("#tool-form")
    .bind("ajax:loading",  toggleLoading)
    .bind("ajax:complete", toggleLoading)
    .bind("ajax:success", function(xhr, data, status) {
      $("#response").html(status);
    });
});

大!:)

[更新:2011年12月29日]

最近有两个事件被重命名:

  • ajax:beforeSend:更换后期 ajax:loading
  • ajax:error替换ajax:failure(我想更符合jQuery本身)

因此,我的示例将变为:

  $("#tool-form")
    .bind("ajax:beforeSend",  toggleLoading)
    .bind("ajax:complete", toggleLoading)
    .bind("ajax:success", function(xhr, data, status) {
      $("#response").html(status);
    });

为了完整起见,事件及其预期参数:

 .bind('ajax:beforeSend', function(xhr, settings) {})
 .bind('ajax:success',    function(xhr, data, status) {})
 .bind('ajax:complete', function(xhr, status) {})
 .bind('ajax:error', function(xhr, data, status) {})


 类似资料:
  • 问题内容: 我正在尝试构建一个发出ajax请求的Google Chrome扩展程序。与GMail Checker扩展程序类似。问题是,当我使用jquery进行请求时,并输入了错误的用户名/密码时,它会静默失败,并忽略错误回调函数。 如果我将ajax调用从background.html脚本(在开发人员窗口中看不到请求)中移出到options.html脚本中,则会得到一个对话框来重新进行身份验证。如果

  • 本文向大家介绍Jquery Ajax xmlhttp请求成功问题,包括了Jquery Ajax xmlhttp请求成功问题的使用技巧和注意事项,需要的朋友参考一下 今天遇到了一个极其奇怪的问题,用各种工具检查都能看到服务器端返回了200,数据也是正常的,但是$.ajax 始终进不到success,郁闷啊,在网上找, 常见问题场景: 1.跨域; 2. $.ajax 没设置 dataType,及服务器

  • 问题内容: 我想每次发送ajax请求时显示一个“正在加载”进度栏。是否有可能在任何时候使用jQuery发送ajax请求时收到通知? 问题答案: 您可以使用该方法来设置将应用于整个页面的全局AJAX属性:

  • 问题内容: 我需要通过Ajax向远程域发出POST请求,我知道Same-Origin Policy的限制,但我读过,有可能在服务器上的PHP中建立网桥以转发请求。 事实是我不知道如何编写此桥,也无法在Google上找到信息。 我想我需要使用CURL。 有人可以解释一下我怎么写吗? 问题答案: 如果需要代理服务器或“ Bridge ”,则可以尝试以下操作:您可以实现对该PHP脚本的简单AJAX调用,

  • 问题内容: IE中的以下AJAX调用失败。 错误函数返回 没有向服务器发出请求,因此我认为JSON没有问题。 已修复,请参阅#1351389 问题答案: 固定,我将content-type从更改为just plain 。 我讨厌IE :) 另外,为了避免IE超级缓存,请尝试以下操作: 这样,每个请求都是IE获得:D的新网址

  • 我用JQuery 2.0.3这样做http post: json在服务器上发布和编写,但是响应和在AFAIK中没有启用。接收json数据的控制器代码为 我如何还能使成功和失败得到发布的json成功接收或提交失败的回调?它可以提交数据,但是来自服务器的响应不做任何事情,这与控制器方法没有区别,只是用语句写入数据。您是否可以建议一个改进,以便发布数据的javascript也接收响应,我认为如果服务器出