繁体   English   中英

如何在通过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在location.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调用重新加载页面!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM