【问题标题】:Devise sign_out_and_redirect flash notice设计sign_out_and_redirect flash 通知
【发布时间】:2014-09-21 16:38:27
【问题描述】:

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

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

我的代码如下所示:

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

我已经使用上面的代码进行了尝试,但是当我触发重复会话时,浏览器会退出但不显示 flash 通知。

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

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

【问题讨论】:

    标签: ruby-on-rails-3 devise


    【解决方案1】:

    你可以使用会话吗?

    def check_concurrent_session
        if duplicate_session?
          sign_out_and_redirect(current_user)
          session[:dupilication_notice] = "Duplicate Login Detected"
        end
      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 之后。

    Anything you place in the flash will be exposed to the very next action

    【讨论】:

    • 今天早上我会试一试。感谢您的洞察力!
    【解决方案2】:

    您可以在不重定向的情况下退出并稍后使用 Flash 消息进行重定向。使用after_sign_out_path_for 方法将确保您使用正确的重定向路径,即使它已被自定义。

    按照你的例子:

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

    【讨论】:

      【解决方案3】:

      对于较新版本的设计,您还可以在清除用户会话后重定向到新的用户会话路径。

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

      这将在重定向后保持闪存

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-08
        • 1970-01-01
        • 2012-01-13
        • 2011-07-18
        • 1970-01-01
        • 2021-09-05
        • 2021-04-04
        相关资源
        最近更新 更多