Ruby on rails Rails-AJAX window.location重定向不起作用
在我的Rails应用程序中,字符串化JSON表单输入通过AJAX传递给控制器-成功后,用户将被重定向到摘要页面,但AJAX重定向似乎不起作用Ruby on rails Rails-AJAX window.location重定向不起作用,ruby-on-rails,ajax,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"))}, da
$.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
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
其他一切似乎都很好——数据已输入,但重定向不会触发。我到处搜索,看起来这是每个人都说要使用的语法,但似乎对我不起作用。我肯定我做错了什么,但我不确定是什么
编辑以澄清问题/解决方案
在与@Jonathan和@Kumar聊天时,我注意到
window.open(“/report/summary”)
工作正常-@Jonathan建议我在ajax调用之前尝试console.log(window.location)
,令我惊讶的是,我应用程序中其他地方的函数的脚本被记录了下来。现在大震惊了-函数名为location()
!!!重命名函数,然后在新窗口中重新启动应用程序,解决了此问题。孩子们,从我的错误中吸取教训-不要给函数命名location()
Ruby不是我的第一语言,但它看起来不像是在回送响应。尝试return
ing某物或put
ing。查看如何使用rails实现这一点,这是一个正确的响应。可能是呈现json:[success:200]
之类的东西。也许这无关紧要。在任何情况下,如果它不起作用,请尝试更改success
的complete
并注销对调试的响应。成功总是会爆发,但成功并不总是
试试这个:
respond_to do |format|
format.json do
render json: {
success: 200
}.to_json
end
end
在AJAX设置中,添加“数据类型”:“json”
如果出现问题,您可以改进对有条件地发送失败的响应,如success:500
这里不需要respond\u to
block,因为您总是希望使用JSON,但如果没有弄错的话,这就是Rails中经常使用的格式
如果这不起作用,只需使用呈现json:
部分,因为这肯定是一个返回
更新
从我们的讨论中进一步发现,在发出一个健壮的Ajax调用并调整操作之后,最后一个障碍是window.location不起作用。问题的原因是位置已恢复到另一个功能。最后需要做的就是重命名该自定义函数和Bob的叔叔。添加一个数据类型
$.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
end
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
它在什么时候停止工作?您是否在代码中添加了
byebug
s,以确保返回的是任何内容,而不是崩溃?嗯。。。我看得出你是对的,我什么都不退。事实上,我自己对Rails还不熟悉,我必须弄清楚如何做到这一点。是的,所以这里需要做的是发送一个HTTP响应代码,如成功为200,失败为500或其他。然后,您的AJAX将了解幕后发生的事情——好的或坏的,您可以通知用户,而不是做出假设。哇,在您进行编辑时,我在代码中做了几乎相同的事情!不过你的稍微好一点,所以我会借它。。。成功条件下的console.log显示代码一直正确触发,但重定向仍然不起作用!啊@skwidbreth请让我知道你的当前状态(我现在不在)是的-多亏了你的努力,我才能够让它工作。首先,您在这里向我展示的一切都是有帮助和必要的,但让它发挥作用的是,您建议我在AJAX调用之前获取window.location的值,这表明该值是由一些地理定位功能在我的应用程序的另一部分中设置的。为了让它正常运行,我只需要关闭并重新打开窗户(啊!)。请编辑您的答案,以反映这种奇怪的叙述,这是您应得的绿色检查,朋友。谢谢-我最终添加了数据类型,您的控制器代码可以生成200状态,但仍然没有重定向!我一定是做错了什么…请也添加一个错误回调,并记录成功和错误响应。查看我的更新。检查控制台上打印的内容。我添加了错误条件,但控制台上没有打印任何内容。这就是为什么我们有两个字符串“Response is”和“error is”。我们可以知道我们在哪个功能中?你是说连这两条线都没有印出来?