Рельсы 3.1 кнопка дистанционного ненавязчивый JavaScript событие не ловится (на jQuery)


Я хочу начать использовать события Ajax ajax: success, ajax: failure, ajax: complete и ajax: beforeSend, как рекомендуется для ненавязчивого Javascript в таких сообщениях, как:

Но по какой-то причине это не работает для меня. Я упускаю что-то (что-то маленькое), так как я не могу получить события, чтобы вызвать мой Яваскрипт. Я надеюсь, что кто-то сможет заметить "очевидную" ошибку/упущение в моем коде.

Некоторые подробности о моем окружении:

  • рельсы 3.1
  • jQuery (jQuery-rails gem)
  • therubyracer для обработки js на стороне сервера (не то, чтобы это имело значение для моего примера)

Чтобы попытаться понять, чего мне не хватает, я создал простое тестовое приложение, которое имеет одну удаленную кнопку. Когда кнопка нажата, я хочу, чтобы сработали предупреждающие флажки. Код этого приложения можно увидеть на github здесь:

Http://github.com/jpmcgrath/rbtest

Я развернул приложение к heroku здесь:

Http://rbtest.heroku.com/projects/

Если вы посмотрите на приложение, вы можете нажать кнопку, и кнопка успешно создаст новый проект (чтобы увидеть его обновление вручную), но ajax: success event, кажется, не происходит?

Суть кода заключается в следующем:

В projects_controller.rb

def remote_test
  @project = Project.new(:name => "remote test")

  respond_to do |format|
    if @project.save
      puts "project saved!nnn"
      format.html { redirect_to @project, notice: 'Project was successfully created.' }
      format.json { render json: @project, status: :created, location: @project }
    else
      format.html { render action: "new" }
      format.json { render json: @project.errors, status: :unprocessable_entity }
    end
  end
end

В приложение.js

jQuery(document).ready(function() {

  jQuery(".remote_button").click(function() {
    alert('Handler for .click() called.');
  })
  .bind("ajax:complete", function() {
    alert('complete!');
  })
  .bind("ajax:beforeSend", function () {
    alert('loading!');
  })
  .bind("ajax:error", function (xhr, status, error) {
    alert('failure!');
  })
  .bind('ajax:success', function(event, data, status, xhr) {
    alert('success!');
  });
});

В представлении проекты / индекс.формат html.erb

<%= button_to "remote test", remote_test_path, :remote => true, :class => 'remote_button'  %>
Если бы кто-нибудь мог указать на то, что я упускаю (я подозреваю, что это как-то связано с типом ответа), он был бы очень признателен.
2 2

2 ответа:

Причина, по которой ваш обработчик событий не срабатывает, заключается в том, что ваш селектор находится на неправильном элементе. button_to создает форму с одним входным тегом, и именно этот входной тег имеет выбранный вами класс, но события ajax запускаются на форме, а не на входном теге.

Попробуйте это

jQuery(document).ready(function() {

  jQuery(".remote_button").click(function() {
    alert('Handler for .click() called.');
  });

  jQuery("form.button_to").bind("ajax:complete", function() {
    alert('complete!');
  })
  .bind("ajax:beforeSend", function () {
    alert('loading!');
  })
  .bind("ajax:error", function (xhr, status, error) {
    alert('failure!');
  })
  .bind('ajax:success', function(event, data, status, xhr) {
    alert('success!');
  });
});

Я сделал то же самое в своей консоли firebug, и она запустила обработчик ajax:success, когда обратный вызов был в форме.

Чтобы изменить класс в форме, используйте: form_class возможность изменить его с button_to на что-то другое

<%= button_to "remote test", remote_test_path, :remote => true, :class => 'remote_button', :form_class => 'remote_button_form' %>

Затем добавьте свои обратные вызовы ajax, используя

jQuery(".remote_button_form").bind ...

Http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-button_to

Rails изменил способ обработки файлов javascript.

Railscasts имеет несколько примеров.

Http://railscasts.com/episodes/279-understanding-the-asset-pipeline

Http://railscasts.com/episodes/267-coffeescript-basics?autoplay=true