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

问题描述 投票:2回答:1

我有一个在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调用有什么问题?

ruby-on-rails session-timeout
1个回答
0
投票

首先,您需要更改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'
    });
  });
});
© www.soinside.com 2019 - 2024. All rights reserved.