Контроллер не вызывается при отображении erb и, следовательно, не может перенаправить пользователя на страницу входа после истечения времени ожидания сеанса - Ruby on Rails - PullRequest
2 голосов
/ 02 апреля 2019

У меня есть метод 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?

Или следуетЯ делаю что-то еще, как чистый подход?

Каково решение этой проблемы?

Пожалуйста, помогите!

Я попытался добавить приведенный ниже вызов 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?

1 Ответ

0 голосов
/ 02 апреля 2019

Прежде всего, вам нужно изменить метод 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

Затем сделайте AJAX-вызов на check_login, когда пользователь нажмет на любую из вкладок, и все готово.

$(document).ready(function() { 
  $(document).on("click", "a.nav-link", function(event){

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