2011-02-09 7 views
2

私はajaxyサインアップをレール3で実装しようとしています。私はjquery-ujsとリモートフォームを使用しています。 $.getリクエストでサインアップフォームにアクセスし、正しく表示されます。このサインアップフォームは、リモートです:私application.jsでjquery-ujs ajaxイベントは処理されません

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

、フォームを取得するためのAJAXリクエストが成功した場合、私は控えめなJavaScriptからのAjaxイベントのハンドラをバインドしようとしている:

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コンソールには何もありませんが、リクエストが正しく処理され、 )。同じセレクタ(form[data-remote])に他のイベントをバインドできます(clickなど)。これらは正しく処理されます。

.liveによってバインドされたAjaxイベントも処理されません。しかし、フォームがレイア​​ウトの一部としてレンダリングされた場合(つまり、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 

は私が間違って何をしているのですか?このような「ダブルアジャクス」フォームを実装するためのより良いアプローチがあるかもしれませんか?

答えて

2

愚かな私。私は完全に別の潜在的な問題の原因を見逃してしまった。私は自分のアプリケーションのレイアウトに

javascript_include_tag :all 

があったが、それは私のページにjquery.jsjquery.min.jsの両方を含む原因。それはその奇妙な行動の原因であることが分かった。 jquery.min.jsを削除すると、そのトリックは完了しました。いつか誰かのために役立つことを願っています。

関連する問題