Rails - AJAX window.location重定向无法正常工作

时间:2016-06-24 21:26:51

标签: ruby-on-rails ajax

在我的Rails应用程序中,字符串化的JSON表单输入通过AJAX传递给控制器​​ - 成功后,用户将被重定向到摘要页面,但AJAX重定向似乎不起作用......

$.ajax({
    url: "report/submission",
    type: "POST",
    beforeSend: function(xhr) {xhr.setRequestHeader("X-CSRF-Token", $("meta[name='csrf-token']").attr("content"))},
    data: {"report" : reportParameter},
    success: function(response) {
        window.location.href = "/report/summary";
    }
});

和相关的控制器

def submission
    @incomingReport = ActiveSupport::JSON.decode(params[:report])

    @newReportIDArray = Array.new

    @incomingReport.each do |x|

        hash = ActionController::Parameters.new(x)

        @new_report = Report.new(report_params(hash))
        @new_report.save

    end
end

其他所有内容似乎都运行正常 - 输入数据,但重定向不会触发。我四处搜索,看起来这是每个人都说要使用的语法,但它似乎对我不起作用。我确定我做错了什么,但我不确定是什么。

编辑以澄清问题/解决方案 在与@Jonathan和@Kumar聊天时,我注意到window.open("/report/summary")确实正常工作 - @Jonathan建议我在ajax调用之前尝试console.log(window.location),令我惊讶的是,来自函数的脚本我的应用程序中的其他位置已记现在感到非常震惊 - 这个功能被召唤location()!重命名该功能,然后在新窗口中重新启动应用程序解决了这个问题。从我的错误中学习,孩子们 - 不要命名一个函数location()

2 个答案:

答案 0 :(得分:1)

Ruby不是我的第一语言,但它看起来并不像你要回复一样。尝试func changeLocation(newLocation: String) { // Perhaps add an instance variable to 'remember' the location of the car switch newLocation { case "junkyard": Car.population -= 1 default: // Perhaps check whether previous location was Junkyard and increment // counter if the Car is coming out of the Junkyard print("Unrecognized location") } } 某事或return。查看如何使用rails,正确的响应。也许是puts或类似的东西。也许这是无关紧要的。在任何情况下,如果它不起作用,请尝试更改render json: [success: 200] success并注销调试响应。完整将始终激发,但成功并不总是。

试试这个:

complete

在您的AJAX设置中,添加respond_to do |format| format.json do render json: { success: 200 }.to_json end end

如果出现问题,您可以改善响应以有条件地发送"datatype": "json"之类的失败。

这里你真的不需要success: 500阻止,因为你总是期待JSON,但这是Rails中经常使用的那种格式,如果没有弄错的话。

如果这不起作用,只需使用respond_to部分,因为这绝对是一个回报。

<强>更新 进一步从我们的讨论中可以看出,在进行了强大的Ajax调用并调整了动作之后,最后的障碍是window.location无法正常工作。问题的原因是位置已经反弹到另一个功能。最后需要做的就是重命名自定义函数,鲍勃是你的叔叔。

答案 1 :(得分:1)

添加数据类型

$.ajax({
  url: "report/submission",
  type: "POST",
  dataType: 'json', #Add json data type, as we'll render json from controller
  beforeSend: function(xhr) {xhr.setRequestHeader("X-CSRF-Token", $("meta[name='csrf-token']").attr("content"))},
  data: {"report" : reportParameter},
  success: function(response) {
    console.log("Response is ", response);
    //When we get 200, this function should execute
    window.location.href = "/report/summary";
  },
  error: function(error){
    console.log("Error is ", error);
  }
});

在控制器中

def submission
  @incomingReport = ActiveSupport::JSON.decode(params[:report])
  @newReportIDArray = Array.new
  @incomingReport.each do |x|
    hash = ActionController::Parameters.new(x)
    @new_report = Report.new(report_params(hash))
    @new_report.save
  end
  respond_to do |format|
    format.json { head :ok } #This will return 200 status back to ajax call
  end
end