OK、これは私を夢中にさせています。まず、私の開発環境ではすべて正常に動作します。ただし、本番環境では、複数のブラウザー間で動作に一貫性がありません。うまくいくこともあれば、うまくいかないこともあります。Rails 3.1 と jQuery 1.8.2 を使用しています。私はjQuery 1.4.1を使用していましたが、それも機能していませんでした。
ユーザーが「保存」ボタンをクリックすると、クライアントはJSON形式のデータをレールに送信し、レールはそれを使用していくつかの新しい「応答」アイテムを作成し、ユーザーをコントローラーの「表示」アクションにリダイレクトします(ユーザーが応答します)すべてのユーザーの結果が表示されます)。
私の見解(answer.html)からの関連コードは次のとおりです。
$.ajaxSetup({
'beforeSend': function(xhr) {
xhr.setRequestHeader("Accept", "text/javascript")
}
});
$(document).ajaxSend(function(e, xhr, options) {
var token = $("meta[name='csrf-token']").attr("content");
xhr.setRequestHeader("X-CSRF-Token", token);
});
var plot;
var dataseries = [[[null,null]],[[null,null]],[[null,null]],[[null,null]],[[null,null]],[[null,null]],[[null,null]],[[null,null]],[[null,null]]];
$(document).ready(function(){
$('.save_button').click(function(event){
event.preventDefault();
var numItems = dataseries.length;
var item;
var sequence;
var question = <%=@question.id%>;
var dataArray = new Array();
for (i=0;i<numItems;i++){
var requestObj = {
question_id: "<%=@question.id%>",
user_id: "<%= @user %>",
}
item = $('.item_list li[data-seq='+i+']').attr('id');
requestObj["item_id"] = item;
requestObj["x"]= dataseries[i][0][0];
requestObj["y"]= dataseries[i][0][1];
if (requestObj["item_id"]>0 && requestObj["x"]!=null && requestObj["y"]!=null ){
dataArray.push(requestObj);
}
}
var dataString = JSON.stringify(dataArray);
var a = $.ajax({
url: "/responses/batchCreate",
data: dataString,
type: "POST",
dataType: 'json',
success: function(data, textStatus, jqXHR) {
},
error: function(jqXHR, textStatus, errorThrown) {
alert('error:');
},
headers: {
'X-CSRF-Token': '<%= form_authenticity_token.to_s %>'
}
})
window.location.replace("<%=question_path(@question)%>");
});
$('.save_button').click(function(event) は毎回起動します。「エラー」コールバックも毎回起動しますが、時々動作します!
関連するコントローラーコードは次のとおりです。
def batchCreate
logger.info "RECEIVED AJAX DATA!!!!"
responses = ActiveSupport::JSON.decode(request.body.read)
responses.each do |resp|
if (resp["item_id"]!=:null && resp["x"]!=:null && resp["y"]!=:null )
@response = Response.new()
if resp["user_id"]!=""
@response.user_id=resp["user_id"];
else
u = User.where(:token => cookies[:user]).first
if u.nil?
u = User.create!(:email => "guest_#{Time.now.to_i}#{rand(99)}@example.com", :password => cookies[:user], :token => cookies[:user])
@response.user_id=u.id
else
@response.user_id = u.id
end
end
@response.question_id=resp["question_id"].to_i
@response.item_id = resp["item_id"].to_i
@response.x = resp["x"].to_i
@response.y = resp["y"].to_i
@response.save
end
end
respond_to do |format|
format.html { redirect_to @response, :notice => 'Question was successfully created.' }
format.json { render :json => response, :status => :created, :location => @response }
format.js
end
end
場合によっては、データが保存され、DB に新しい応答が作成され、ページが show アクションにリダイレクトされます。それ以外の場合は、ページをリロードするだけです。これらの例では、投稿データがサーバーに届いているようには見えません - production.log には何も表示されません。
私は ajax の完全な初心者で、Rails については少しだけ有能です。この問題のトラブルシューティングを開始する方法についても、ご提供いただける洞察をいただければ幸いです。ありがとうございました。