如何在通过ajax发出的控制器请求结束时进行有效的浏览器重定向
How do I make a valid browser redirect at the end of a controller request hit via ajax
我向以下控制器方法发出ajax请求:
def destroy
...
redirect_to "/courses"
end
控制台显示重定向和渲染工作,但浏览器实际上并没有加载页面(可能是因为请求是由ajax而不是标准HTTP发出的)。我想让浏览器加载/courses
页面,我该怎么做?
您可以在位置从客户端JavaScript发送重定向。href如下所示:
$.ajax("/destroy")
.done(function() {
location.href="/courses";
});
我不知道您的ajax调用使用什么库,所以我只使用了jQuery语法。
首先,您需要将路由更改为destroy.js,而不是destroy。它将使rails呈现一个js模板,而不是html模板。
= link_to 'Destroy', course_path(@course_id), method: :destroy, format: :js
然后,创建一个destroy.js.erb(或者haml,如果你正在使用的话),并在那里添加javascript代码:
window.location.href = '/courses';
如果您无论如何都要重定向用户浏览器,那么您应该考虑一下为什么要使用ajax:)
响应
底线是,您不能从ajax请求重定向-您必须在响应中适应重定向
Ajax基本上会向应用程序的后端发送一个"伪请求"。这个请求最好被描述为非常"愚蠢"——它只能直接处理来自启动请求的响应(仅此而已);这意味着,如果你想处理重定向,你需要在浏览器端处理它。
我会考虑这样做:
#app/controllers/courses_controller.rb
class CoursesController < ApplicationController
respond_to :js, only: :destroy
def destroy
@course = Course.find params[:id]
@course.destroy
end
end
#app/views/courses/destroy.js.erb
window.location.assign("<%=j courses_index_path %>");
这将是阻止"重定向"的最有效方法。这根本不是重定向-只是JS根据特定时间的JS调用重新加载页面!!
相关文章:
- 为什么“;未定义的“;在JavaScript中结束循环
- 循环结束/推送到数组之前在页面上呈现EJS
- 如何有效地将游戏数据存储在URL查询字符串中
- 如何使用Node.js最有效地解析网页
- jquery代码在Mozilla中有效,但在其他浏览器上无效
- 在另一个函数成功结束后调用该函数
- 在动画结束之前调用函数
- 有效形式-始终只显示1个错误[角度]
- Javascript袖珍参考,第121页:这是怎么回事;猴子补丁”;方法应该有效
- 单击仅在第二次单击后有效
- 什么'是在asp.net MVC中将本地化的resources.resx文件转换为javascript文件的有效
- 为什么自我执行匿名有效
- D3.js生成有效的SVG,但不显示任何内容
- jquery ajax”;SyntaxError:意外的输入结束“;基于有效的JSON
- 什么'当内容用完时,这是结束无限滚动的最有效方法
- Javascript-JSON.parse:数据意外结束-使用有效JSON时出错.我做错了什么
- 如何在通过ajax发出的控制器请求结束时进行有效的浏览器重定向
- Regexp -找到我的电子邮件Id结束与有效的域
- Ajax调用在IE和Chrome中有效(仅在Firefox中,当在Ajax调用结束时以调试模式添加断点时)
- 使用javascript验证表单,我有开始和结束日期选择器,它应该只允许当前日期和有效时间,而不允许第二天