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