rails3 rails.js и jquery ловят успех и провал ajax-запросов - PullRequest
25 голосов
/ 17 августа 2010

Ранее в рельсах 2.3.8 я использовал прототипы-помощники link_to_remote и form_remote_for (среди прочих).

У них была опция :update следующим образом:

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

(пример из документации ).В этом примере при успешном обновлении html-элемента будет указан класс «cart», а при ошибке - «error».

Теперь я считаю, что modus operandi изменился, вместо этого пишем:

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 ]

71 голосов
/ 17 августа 2010

Ха!Я нашел это описанным в этой статье.В rails.js проверяются следующие обратные вызовы:

  • ajax: загрузка: срабатывает до выполнения запроса AJAX
  • ajax: success: срабатывает после успешного запроса AJAX
  • ajax: complete: срабатывает после завершения запроса AJAX, независимо от состояния ответа
  • ajax: fail: fail: срабатывает после неудачного запроса 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) {})
4 голосов

Соответствующую направляющую рельсов 4 можно найти по адресу: http://guides.rubyonrails.org/working_with_javascript_in_rails.html

Указывает на документацию событий по адресу: https://github.com/rails/jquery-ujs/wiki/ajax, как упомянуто ncherro

Фактические значения, переданные обратным вызовам, могут быть выведены из метода ajax jQuery http://api.jquery.com/jquery.ajax/#jQuery-ajax-settings

.bind устарела в пользу .on от jQuery: http://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"
1 голос
/ 26 февраля 2014

Я знаю, что этому вопросу уже 3 года, но он высоко оценивается в результатах Google, и некоторые из перечисленных выше событий больше не используются.

См. Здесь текущий список - https://github.com/rails/jquery-ujs/wiki/ajax

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...