如何在通过ajax命中的控制器请求结束时进行有效的浏览器重定向

时间:2014-09-21 05:58:58

标签: javascript jquery ruby-on-rails ajax

我向以下控制器方法发出ajax请求:

def destroy
    ...
    redirect_to "/courses"
end

控制台显示重定向和呈现工作,但浏览器实际上并未加载页面(可能是因为请求是由ajax而不是标准HTTP发出的)。我想让浏览器加载/courses页面,我该怎么做?

3 个答案:

答案 0 :(得分:0)

您可以通过 location.href 从客户端JavaScript发送重定向,如下所示:

$.ajax("/destroy")
  .done(function() {
    location.href="/courses";
  });

我不知道你用于ajax调用的库,所以我只使用了jQuery语法。

答案 1 :(得分:0)

首先,您需要将路线更改为destroy.js而不是销毁。它会使rails渲染一个js模板而不是一个html模板。

= link_to 'Destroy', course_path(@course_id), method: :destroy, format: :js

然后,创建一个destroy.js.erb(或haml,如果你正在使用它)并在那里添加javascript代码:

window.location.href = '/courses';

如果你反过来重定向用户浏览器,你应该考虑为什么要使用ajax:)

答案 2 :(得分:0)

<强>响应

最重要的是,您无法从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调用重新加载页面!!