在我的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()
。
答案 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