Rails 控制器方法在 Ajax 调用后不重新加载页面

Posted

技术标签:

【中文标题】Rails 控制器方法在 Ajax 调用后不重新加载页面【英文标题】:Rails Controller Method Not Reloading Page After Ajax Call 【发布时间】:2014-08-25 03:44:18 【问题描述】:

所以我构建了一个身份验证方法,它充当控制器中其他方法的前置过滤器。基本上,如果用户未登录,我希望该方法重定向到根路径。这是我的 authenticate_user!过滤方法前:

def authenticate_user!
      unless current_user
        flash[:notice] = "Your session has ended. Please login again."
        render js: "window.location.pathname = '#root_path'"
      end
end

我遇到的问题是窗口本身没有重新加载,而是页面内的内容元素和显示的文本:“window.location.pathname = '/'”。我无法使用redirect_to(我找到了similar question here),因为它似乎只是将某个内容元素发送回root_path(而像导航栏这样的元素保持不变)。这就是为什么我一直在寻找一个完整的窗口重新加载。任何帮助将不胜感激。

使用服务器日志编辑

Started GET "/projects/editHeader?fileName=test.csv" for 127.0.0.1 at 2014-07-04 10:37:21 -0400
Processing by ProjectsController#editHeader as TEXT
  Parameters: "fileName"=>"test.csv"
Filter chain halted as :authenticate_user! rendered or redirected
Completed 200 OK in 2ms (Views: 0.1ms | ActiveRecord: 0.0ms)


Started GET "/projects/headerDataPreview?fileId=NaN" for 127.0.0.1 at 2014-07-04 10:37:21 -0400
Processing by ProjectsController#headerDataPreview as TEXT
  Parameters: "fileId"=>"NaN"
Filter chain halted as :authenticate_user! rendered or redirected
Completed 200 OK in 1ms (Views: 0.1ms | ActiveRecord: 0.0ms)

【问题讨论】:

【参考方案1】:

使用 ajax 请求需要在 before_filter 方法中指定请求类型

将您的 authenticate_user! 方法更改为

def authenticate_user
  unless current_user
    if request.xhr? # if its a ajax request then redirect with javascript
      flash.keep[:notice] = 'Bla bla bla' # keeps the flash message for next request
      render :js => "window.location = '#root_path'"
    else
      flash[:notice] = "Bla bla bla"
      redirect_to root_path
    end
  end
end

【讨论】:

这个解决方案似乎没有任何变化;它只是将屏幕带到一个带有文本“window.location ='\'”的空白页面。 你能发布你的服务器日志吗?在我当前的项目中,我使用的是相同的代码,并且效果很好。 非常感谢render :js => 应该标记为正确【参考方案2】:

首先 - 将 js 放在控制器中是不好的做法。不要将客户端脚本与服务器处理的控制器混合使用。关于你的问题——你为什么不直接使用 rails 重定向?

def authenticate_user!
  unless current_user
    redirect_to root_path, :notice => "Your session has ended. Please login again."
  end
end

【讨论】:

redirect_to 的问题是整个屏幕没有改变——只有内部的内容元素。因此,即使我希望将用户带到没有导航栏的登录启动页面,导航栏也会粘在屏幕上。

以上是关于Rails 控制器方法在 Ajax 调用后不重新加载页面的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC RedirectToAction 在从视图中发布 AJAX 后不起作用

在rails中对控制器操作进行ajax调用

rails 控制器未收到 Ajax 调用

从 Rails 控制台重新加载帮助程序

rails ajax 调用是不是应该捆绑到它们自己的单独控制器中?

如何使用CoffeeScript重新同步setTimeout()? Rails 5