设计sign_out_and_redirect flash通知



我正在运行一个带有Devise 2.1.2的Rails 3.2.14应用程序,并在我的应用程序控制器中检查并发/重复会话。

我希望在我的应用程序控制器中调用signout_and_redirect后,能够在模板视图中显示一个闪烁通知,该通知显示"检测到重复登录"

以下是我的代码:

application_controller.rb

def check_concurrent_session
    if duplicate_session?
      flash[:notice] = "Duplicate Login Detected"
      sign_out_and_redirect(current_user)
    end
  end
  def duplicate_session?
    user_signed_in? && (current_user.login_token != session[:token])
  end

我用上面的代码尝试过,但当我触发重复会话时,浏览器会注销,但不会显示闪烁通知。

在我的application.html.erb中,我有以下设置来显示闪光通知/警报。

<% if flash[:notice] %>
  <p class="alert"><%= flash[:notice] %></p>
<% end %>
<% if flash[:alert] %>
  <p class="alert"><%= flash[:alert] %></p>
<% end %>

您能使用会话吗?

def check_concurrent_session
  if duplicate_session?
    sign_out_and_redirect(current_user)
    session[:duplication_notice] = "Duplicate Login Detected"
  end
end
# users/sessions_controller.rb
def new
  if session[:duplication_notice].present?
    flash.now[:alert] = session[:duplication_notice]
    session.delete(:duplication_notice)
  end
  super
end

flash的生存期是直到下一个操作。

  1. sign_out_and_redirect
  2. authenticate_user!
  3. sign_in

日志

Started GET "/" for 127.0.0.1 at 2015-04-13 17:08:02 +0900
Processing by Users::FunctionsController#home as HTML
Filter chain halted as :check_concurrent_session rendered or redirected
Completed 302 Found in 9ms (ActiveRecord: 0.9ms)
Started GET "/" for 127.0.0.1 at 2015-04-13 17:08:02 +0900
Processing by Users::FunctionsController#home as HTML
Completed 401 Unauthorized in 1ms
Started GET "/users/sign_in" for 127.0.0.1 at 2015-04-13 17:08:02 +0900
Processing by Users::SessionsController#new as HTML
Completed 200 OK in 3258ms (Views: 3254.7ms | ActiveRecord: 0.3ms)

因为sign_out清除了session,所以会话设置在sign_out之后。

你放在闪光灯中的任何东西都将暴露在下一个动作

您可以在不重定向的情况下注销,稍后使用flash消息进行重定向。使用after_sign_out_path_for方法将确保使用正确的重定向路径,即使它是自定义的。

以您为例:

if duplicate_session?
  user = current_user
  sign_out(user)
  redirect_to after_sign_out_path_for(user), 
              alert: 'Duplicate Login Detected'
end

对于最新版本的design,您也可以在清除用户会话后重定向到新的用户会话路径。

if duplicate_session?
  flash[:notice] = "Duplicate Login Detected"
 
  sign_out current_user
  redirect_to new_user_session_path
end

这将在重定向后持续闪烁

最新更新