rails3 rails.js and jquery catching success and failure of ajax requests

后端 未结 3 813
星月不相逢
星月不相逢 2020-12-04 15:52

Previously, in rails 2.3.8 i used the prototype-helpers link_to_remote and form_remote_for (amongst others).

These had the option :u

相关标签:
3条回答
  • 2020-12-04 16:22

    Ha! I found it described in this article. In rails.js the following callbacks are checked:

    • ajax:loading : triggered before executing the AJAX request
    • ajax:success : triggered after a successful AJAX request
    • ajax:complete : triggered after the AJAX request is complete, regardless the status of the response
    • ajax:failure : triggered after a failed AJAX request, as opposite to ajax:success

    As the javascript should be unobtrusive, this coupling is not done in the HTML.

    An example (from the same site) : the following Rails 2.3.8

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

    is translated to this :

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

    and inside some javascript (application.js), you bind the events

    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);
        });
    });
    

    Great! :)

    [UPDATE: 29/12/2011]

    Two events have been renamed lately:

    • ajax:beforeSend: replace the late ajax:loading
    • ajax:error replaces the ajax:failure (I guess to be more in line with jQuery itself)

    So my example would become:

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

    For completeness, the events and their expected parameters:

     .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) {})
    
    0 讨论(0)
  • 2020-12-04 16:23

    I know this question is 3 years old, but it comes up high in Google results and some of the events listed above are not used anymore.

    See here for a current list - https://github.com/rails/jquery-ujs/wiki/ajax

    0 讨论(0)
  • 2020-12-04 16:39

    The related rails 4 guide can be found at: http://guides.rubyonrails.org/working_with_javascript_in_rails.html

    It points to the documentation of the events at: https://github.com/rails/jquery-ujs/wiki/ajax , as mentioned by ncherro

    The actual values passed to the callbacks can be inferred from jQuery's ajax method http://api.jquery.com/jquery.ajax/#jQuery-ajax-settings

    .bind is deprecated in favor of .on by jQuery: http://api.jquery.com/on/

    So now the recommended approach is:

    Template:

    <%= 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"
    
    0 讨论(0)
提交回复
热议问题