Подтвердить что ты не робот

Rails 3 AJAX удаленная форма обратного вызова

Я обновляюсь с rails 2.3.8 до 3.0.0, поэтому мне нужно заменить remote_form_for вспомогательные вызовы form_for(@object, :remote=>true).

Я слежу вместе с Simone Carletti, но я не могу получить ответные сообщения ajax от rails.js для запуска.

Мой сгенерированный HTML:

<form accept-charset="UTF-8" action="/vendor_shipments" class="new_vendor_shipment" data-remote="true" id="formname" method="post">

javascript, с которым я тестирую:

jQuery(function($){ 
   alert('document ready');
   $("#formname")
      .bind('ajax:loading', function() {alert("loading!");})
      .bind('ajax:success', function(data, status, xhr) {alert("success!");})
      .bind('ajax:failure', function(xhr, status, error) {alert("failure!");})
      .bind('ajax:complete', function() {alert("complete!");});
});

Предупреждение "готовность к документу" запускается, и запрос ajax успешно выполняется (данные отправляются на сервер), но ни один из обратных вызовов "ajax:____" не срабатывает.

Что я делаю неправильно?

(для чего он стоит, сама форма загружается через ajax)

4b9b3361

Ответ 1

Ничего себе, это была колоссальная трата вечера.

Выполняя это так, как я сделал, прототип по умолчанию rails.js не будет связывать обратные вызовы.

После преобразования в jQuery на основе rails.js (http://github.com/rails/jquery-ujs) обратные вызовы работают нормально.

Ответ 2

Вы можете инициировать обратные вызовы на основе Prototype, например:

$('formname').observe('ajax:before', function(){
  ...
});

$('formname').observe('ajax:complete', function(request){
  ...
});

Однако, я не думаю, что объект request в обратном вызове ajax:complete содержит ответ. Я привык к jQuery и надеялся, что доступ к ответу будет простым. Вместо этого, похоже, что переход на jQuery-Rails может быть проще, поскольку я не могу найти код прототипа Drop-in, чтобы заменить функциональность :update у удаленных помощников Rails 2.

Ответ 3

Если принятый ответ не устранил вашу проблему, проверьте, есть ли у вас встроенные библиотеки jQuery. В моем случае у меня была две разные версии встроенного jQuery и после удаления одного из них все работало нормально.