Ruby on rails 呈现erb时不会调用控制器,因此无法在会话超时后将用户重定向到登录页面-Ruby on Rails

Ruby on rails 呈现erb时不会调用控制器,因此无法在会话超时后将用户重定向到登录页面-Ruby on Rails,ruby-on-rails,session-timeout,Ruby On Rails,Session Timeout,我在ApplicationController中实现了一个check\u login方法,如果用户的会话超时,该方法会将用户重定向到登录屏幕 但是我的屏幕上有一个选项卡,它有多个子选项卡-当用户单击任何子选项卡时,就会呈现一个erb模板 会话超时后,当用户单击任何子选项卡时,调用该子选项卡对应的erb模板;但没有一个击中控制器。因此,不会调用我的check\u login方法,也不会将用户重定向到登录屏幕 如何解决此问题 这是我在我的应用程序控制器中进行的会话超时检查: class Applic

我在
ApplicationController
中实现了一个
check\u login
方法,如果用户的会话超时,该方法会将用户重定向到登录屏幕

但是我的屏幕上有一个选项卡,它有多个子选项卡-当用户单击任何子选项卡时,就会呈现一个
erb
模板

会话超时后,当用户单击任何子选项卡时,调用该子选项卡对应的
erb
模板;但没有一个击中控制器。因此,不会调用我的
check\u login
方法,也不会将用户重定向到登录屏幕

如何解决此问题

这是我在我的
应用程序控制器中进行的会话超时检查:

class ApplicationController < ActionController::Base

  before_action :check_login, :apply_layout

  def check_login
        logger.info "ApplicationController check_login"

        if session[:current_user]
              set_current_user
        else
              render :partial => 'sessions/login.html.erb'
        end
  end
当调用上述子选项卡的
erb
erb
时,是否有方法调用控制器以便执行我的
check\u login

或者我应该做些别的事情作为一个干净的方法

这个问题的解决方案是什么

请帮忙

我尝试在上面显示的erb中添加以下ajax调用:

<script type='text/javascript'>
$(function() { 
$(document).on("click", "#dbr", function(event){

  $.ajax( {
    type: 'GET',
    url: "/application/check_login"
    dataType: 'script'
    });
  });
 });
</script>

$(函数(){
$(文档)。在(“单击”上,“#dbr”,函数(事件){
$.ajax({
键入:“GET”,
url:“/application/check\u login”
数据类型:“脚本”
});
});
});

但是这个ajax调用没有调用
check\u login
方法。这个ajax调用有什么问题?

首先,您需要更改
check\u login
方法以重定向到login,而不是呈现主题板:

def检查\u登录
logger.info“应用程序控制器检查\u登录”
如果会话[:当前用户]
设置当前用户
其他的
#render:partial=>“sessions/login.html.erb”
重定向到在routes.rb中设置的登录url
返回#以避免双重渲染错误
结束
结束
然后,当用户单击任何选项卡时,调用AJAX调用
check\u login
,您就应该完成了

$(文档).ready(函数(){
$(文档)。在(“单击”,“a.nav-link”,函数(事件){
$.ajax({
键入:“GET”,
url:“/application/check\u login”
数据类型:“脚本”
});
});
});

在第一次调用时,您的“渲染”已经在渲染模板,因此它显然不会在以后调用控制器。您可以在选项卡上添加一个ajax调用,用于检查超时/登录,并重定向到登录it user is nolonger@Fallenhero-非常感谢您的回复!如果我从我的一个erb文件向我的ApplicationController::check_login方法发出一个ajax调用,这能解决我的问题吗?记住,渲染在第一次调用时执行(当用户登录时),然后所有ajax调用也会发出。您需要将ajax调用挂接到更改选项卡回调。我猜您正在使用jquery选项卡。因此,请参阅jquery选项卡的事件文档。您可能需要的事件是“activate”或“beforeActivate”@Fallenhero-非常感谢您的输入-我打了一个ajax电话(我已经用这个ajax电话的代码更新了我的原始问题)-但这似乎不起作用。你能指出我做错了什么吗?(另外,你能给我一个关于如何将ajax调用挂接到change tab回调的示例代码吗?非常感谢!)谢谢你的回复。我试过你提到的ajax调用。我还按照您的建议将render partial替换为redirect_to。但是ajax调用似乎不起作用。您能告诉我问题是什么吗?请告诉我们您是如何进行AJAX调用的。他正在打控制器吗?此外,请检查浏览器的开发工具(Ctrl-shitf-i),网络选项卡应记录请求。再次感谢您的回复。我已经用进行ajax调用的代码更新了我的原始问题(希望这是您想要的)。我查看了“网络”选项卡中的开发人员工具-恐怕没有调用控制器。当我单击添加了ajax调用的第一个子选项卡时,“网络”选项卡没有任何UDPATE。请帮忙!不客气。更改
$(文档)。on(“click”、“#dbr”、…)
$(文档)。on(“click”、“a.nav-link”、…)
在单击选项卡时触发事件。我尝试了此操作-
$(function(){$(文档)。on(“click”、“#dbr”、function(event){$.ajax({type:'GET',url:/check\u login”数据类型:'json'});});$(文档)。在(“单击”,“a.nav-link”,函数(事件){$.ajax({type:'GET',url:“/application/check_login”数据类型:'json'});})不起作用。还有,什么是
a.nav-link
;请原谅我的无知——我对JavaScript还很陌生。
<script type='text/javascript'>
$(function() { 
$(document).on("click", "#dbr", function(event){

  $.ajax( {
    type: 'GET',
    url: "/application/check_login"
    dataType: 'script'
    });
  });
 });
</script>