我有一个在check_login
中实现的ApplicationController
方法,如果他的会话超时,它会将用户重定向到登录屏幕。
但是我的屏幕上有一个标签,其中有多个子标签 - 当用户点击任何子标签时,会呈现一个erb
模板。
会话超时后,当用户单击任何子选项卡时,将调用该子选项卡的相应erb
模板;但他们都没有击中控制器。因此我的check_login
方法没有被调用,用户也没有被重定向到登录屏幕。
我该如何解决这个问题?
这是我在ApplicationController
中的会话超时检查:
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
代码,其中包含多个子选项卡:
<div class="container-fluid">
<div id="message" style="background-color:limegreen"> </div>
<div id="error_message" style="background-color:#FF1133"> </div>
<div class="row">
<div class="col-12">
<ul class="nav nav-pills" style=" margin-top: 20px; ">
<li class=" cfs nav-item active">
<a data-toggle="tab" class="nav-link active" href="#dbr">
Application SubTab 1
</a>
</li>
<li class="cfs nav-item">
<a data-toggle="tab" href="#dtr" class="nav-link">
Application SubTab 2
</a>
</li>
<li class="cfs nav-item">
<a data-toggle="tab" href="#cpl" class="nav-link">
Application SubTab 3
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="tab-content tabstyle" >
<div id="dbr" class="tab-pane fade show active" >
<%= render 'application_subtab1/table' %>
</div>
<div id="dtr" class="tab-pane fade">
<%= render 'application_subtab2/table' %>
</div>
<div id="cpl" class="tab-pane fade">
<%= render 'application_subtab3/table' %>
</div>
</div>
<script type='text/javascript'>
$(function() {
$(document).on("click", "#dbr", function(event){
$.ajax( {
type: 'GET',
url: "/application/check_login"
dataType: 'script'
});
});
});
</script>
当上面的erb
或子标签的erb
被调用时,有没有办法调用控制器以便我的check_login
被执行?
或者我应该做一些其他的干净方法?
这个问题的解决方案是什么?
请帮忙!
我尝试在上面显示的erb中添加以下ajax调用:
<script type='text/javascript'>
$(function() {
$(document).on("click", "#dbr", function(event){
$.ajax( {
type: 'GET',
url: "/application/check_login"
dataType: 'script'
});
});
});
</script>
但是这个ajax调用不会调用check_login
方法。这个ajax调用有什么问题?
首先,您需要更改check_login
方法以重定向到登录,而不是渲染themplate:
def check_login
logger.info "ApplicationController check_login"
if session[:current_user]
set_current_user
else
#render :partial => 'sessions/login.html.erb'
redirect_to login_url # Set in your routes.rb
return # To avoid double render error
end
end
然后当用户点击任何选项卡时,对check_login
进行AJAX调用,你应该完成。
$(document).ready(function() {
$(document).on("click", "a.nav-link", function(event){
$.ajax( {
type: 'GET',
url: "/application/check_login"
dataType: 'script'
});
});
});