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

时间:2010-08-17 10:06:21

标签: jquery ruby-on-rails ajax ruby-on-rails-3

以前,在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" }

(来自documentation的示例)。 这个例子在成功更新带有“cart”类的html元素时,失败后会出现“错误”类。

现在我相信作案手法已经改变,而是写下来:

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

并且无法再设置:update。 而不是普通的html,我们现在渲染javascript,就像这样(在jquery中):

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

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

以某种方式能够模仿我们之前的行为似乎对我有用。有什么想法吗?

3 个答案:

答案 0 :(得分:71)

哈!我在this文章中找到了它。在rails.js中,检查以下回调:

  • ajax:loading:在执行AJAX请求之前触发
  • ajax:成功:在成功的AJAX请求后触发
  • ajax:complete:在AJAX请求完成后触发,无论响应状态如何
  • ajax:失败:在失败的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);
    });
});

大! :)

[更新日期:29/12/2011]

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

  • 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) {})

答案 1 :(得分:4)

相关的rails 4指南可在以下网址找到:http://guides.rubyonrails.org/working_with_javascript_in_rails.html

如ncherro

所述,它指向了https://github.com/rails/jquery-ujs/wiki/ajax上的事件文档

传递给回调的实际值可以从jQuery&#39; ajax方法http://api.jquery.com/jquery.ajax/#jQuery-ajax-settings

推断出来 jQuery不赞成.bind

.onhttp://api.jquery.com/on/

所以现在推荐的方法是:

模板:

<%= link_to 'Click me!',
    'path/to/ajax',
    remote: true,
    id: 'button',
    method: :get,
    data: {type: 'text'}
%>

CoffeScript:

$(document).ready ->
  $("#button").on("ajax:success", (e, data, status, xhr) ->
    alert xhr.responseText
  ).on "ajax:error", (e, xhr, status, error) ->
    alert "error"

答案 2 :(得分:1)

我知道这个问题已经过了3年,但是谷歌搜索结果很高,上面列出的一些活动不再使用了。

请点击此处查看最新列表 - https://github.com/rails/jquery-ujs/wiki/ajax