Рельсы 3.1 кнопка дистанционного ненавязчивый JavaScript событие не ловится (на jQuery)
Я хочу начать использовать события Ajax ajax: success, ajax: failure, ajax: complete и ajax: beforeSend, как рекомендуется для ненавязчивого Javascript в таких сообщениях, как:
- http://www.simonecarletti.com/blog/2010/06/unobtrusive-javascript-in-rails-3/
- http://www.alfajango.com/blog/rails-3-remote-links-and-forms/
Некоторые подробности о моем окружении:
- рельсы 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 ответа:
Причина, по которой ваш обработчик событий не срабатывает, заключается в том, что ваш селектор находится на неправильном элементе. 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