0

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 については少しだけ有能です。この問題のトラブルシューティングを開始する方法についても、ご提供いただける洞察をいただければ幸いです。ありがとうございました。

4

2 に答える 2

0

OK、実際には window.location.replace("<%=question_path(@question)%>") が部分的に原因であることがわかりました。さっき返信した時は動かしたと思ったのですが、どうやら動かなかったようです。しかし、それだけでは十分ではありませんでした。アクションのテンプレート ファイルである batchCreate.js.erb もありませんでした。これにより 500 エラーが発生し、それが ajax 呼び出しでエラー状態を引き起こしました。それは今働いているようです。オグの魔法使い、助けてくれてありがとう!

于 2012-10-13T20:38:49.303 に答える
0

クリック ハンドラーの最後にある次の行は、クリックするたびにページをリロードします。

 window.location.replace("<%=question_path(@question)%>");

このリダイレクトにより、AJAX リクエストは実行のタイミングによって完了または完了しない場合があります。これが一貫性のない結果の原因だと思います。おそらく、開発環境での実行時間は、ローカルで問題が発生しない程度のものです。

AJAX リクエストが成功した場合にのみリダイレクトが発生するように、そのコード行を成功応答ハンドラー内に移動することをお勧めします。

success: function(data, textStatus, jqXHR) {
  window.location.replace("<%=question_path(@question)%>");
}

埋め込み Ruby コードを使用して JavaScript を生成することは避け、すべての JavaScript コードをビューからアセット ファイルに移動します。インラインを使用する代わりに<%=question_path(@question)%>、おそらく保存ボタンの href 属性として必要な URL を設定します。

# View
<%= link_to "Save", question_path(@question), :class => "save_button" %>

# JavaScript
...
success: function(data, textStatus, jqXHR) {
  window.location.replace(e.target.href);
}
...

または、href 属性の代わりに data 属性を使用して URL を保存することもできます。

于 2012-10-13T12:52:58.477 に答える