0

好吧,这个让我发疯。首先,在我的开发环境中一切正常。然而,在生产中,该行为在多个浏览器中是不一致的。有时有效,有时无效。我正在使用 Rails 3.1 和 jQuery 1.8.2。我一直在使用 jQuery 1.4.1,但它也无法正常工作。

以下是应该发生的情况:用户单击“保存”按钮,客户端将 JSON 格式的数据发送到 Rails,Rails 使用它创建几个新的“响应”项,然后将用户重定向到控制器“显示”操作(用户回答投票,然后查看所有用户的结果)。

这是我认为的相关代码(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

有时会保存数据,在我的数据库中创建新的响应,并且页面会重定向到显示操作。其他时候,它只是重新加载页面。在这些情况下,发布数据似乎没有到达服务器 - 我在 production.log 中看不到任何内容。

我是 ajax 的完全初学者,并且在 Rails 上的能力稍强一些。您可以提供任何关于如何开始解决此问题的见解,我们将不胜感激。谢谢你。

4

2 回答 2

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)%>内联,也许将您想要的 URL 设置为保存按钮的 href 属性。

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

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

或者,您可以使用 data 属性而不是 href 属性来存储 URL。

于 2012-10-13T12:52:58.477 回答
0

好的,事实证明 window.location.replace("<%=question_path(@question)%>") 部分是罪魁祸首。当我早些时候回复时,我以为我已经移动了它,但显然,我没有。然而,仅此还不够;我还缺少 batchCreate.js.erb,这是我的操作的模板文件。这导致了 500 错误,这就是在 ajax 调用上创建错误条件的原因。它现在似乎正在工作。非常感谢 Ogz 向导的帮助!

于 2012-10-13T20:38:49.303 回答