JQuery-UJS AJAX события не обрабатываются - PullRequest
2 голосов
/ 09 февраля 2011

Я пытаюсь реализовать регистрацию ajaxy с помощью rails 3. Я использую jquery-ujs и удаленную форму.Я получаю доступ к форме регистрации по запросу $.get, и она отображается правильно.Эта форма регистрации удалена:

form_for @user, :remote => true, :html => {"data-type" => "html"} do |f|

В моем application.js, если запрос ajax для получения формы выполнен успешно, я пытаюсь связать обработчик для событий ajax из ненавязчивого JavaScript:

var load_remote_form = function(evt) {
    var href = $(this).attr('href'); 
    // load form template
    $.get(href, {}, function(data) {
        $('body').append(data);

        $('form[data-remote]').bind("ajax:beforeSend", function(e) {
            console.log("Caught beforeSend!");
        });
    });
    evt.preventDefault();
};

$(document).ready(function() {
    $('a#signup').click(load_remote_form);   
});

Инструменты разработки Chrome показывают, что событие "ajax:beforeSend" связано, но оно никогда не обрабатывается (у меня ничего нет в консоли javascript при отправке формы, хотя в журнале rails я вижу, что запрос обрабатываетсяправильно и ответ отправлен).Я могу привязать другие события к тому же селектору (form[data-remote]), как click, и они обрабатываются правильно.

События Ajax, связанные через .live, также не обрабатываются.Но если форма отображается как часть макета (т. Е. Она находится на отдельной странице, например http://localhost:3000/signup/),, с привязкой «ajax:beforeSend» обрабатывается правильно.

Мой контроллер (только для случая, это может быть плохо написано, но я почти уверен, что это работает):

class UsersController < ApplicationController

  layout :layout_for_type

  def new
    @user = User.new
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      session[:user_id] = @user.id
      flash[:notice] = "You have successfully registered."
      redirect_to root_url
    else
      if request.xhr?
        render :action => 'new', :status => :unprocessable_entry, :layout => false
      else
        render :action => 'new'
      end
    end
  end

  def layout_for_type
   request.xhr? ? nil : "application"
  end

end

Что я делаю не так? Может быть, есть лучший подход для реализации таких форм с "двойным доступом"?

1 Ответ

2 голосов
/ 10 февраля 2011

Глупый я.Я полностью упустил еще один потенциальный источник проблем.У меня было

javascript_include_tag :all

в макете приложения, и это привело к включению обоих jquery.js и jquery.min.js на мою страницу.Это оказалось причиной такого странного поведения.Удаление jquery.min.js сделало свое дело.Надеюсь, это когда-нибудь пригодится кому-то.

...