簡體   English   中英

重定向到登錄頁面的任何頁面

[英]Redirect to previous page wherever it is directed to the login page

我正在使用Rails 3.2和Authlogic。 我有以下代碼:

class ApplicationController < ActionController::Base
  private

  def store_location
    session[:return_to] = request.url
  end

  def redirect_back_or_default(default)
    redirect_to(session[:return_to] || default)
    session[:return_to] = nil
  end
end

class UserSessionsController < ApplicationController  
  before_filter :require_no_user, :only => [:new, :create]
  before_filter :require_user, :only => :destroy

  def new
    @user_session = UserSession.new
    @header_title = "Login"
  end

  def create
    @user_session = UserSession.new(params[:user_session])
    if @user_session.save
      flash[:success] = "Login successful!"
      redirect_back_or_default root_url
    else
      render 'new'
    end
  end

  def destroy
    current_user_session.destroy
    flash[:success] = "Logout successful!"
    redirect_back_or_default root_url
  end
end

此代碼非常通用。 當我們使用before_filter

  before_filter :require_user, :only => [:new, :edit, :update, :create]

它將自動將store_location重定向到正確的頁面。 但是,我該怎么做:

  1. 我在posts/1 ,不需要require_user
  2. 我單擊頂部導航欄上的登錄鏈接。
  3. 它顯示登錄頁面。
  4. 登錄后,我將被重定向回posts/1而不是root_url

在會話控制器new動作中直接調用store_location

# user_sessions_controller.rb
def new
  store_location if session[:return_to].blank?
  @user_session = UserSession.new
  @header_title = "Login"
end

這將首先在會話哈希中檢查現有的return_to對。 您不想覆蓋它,以防萬一,例如由於密碼錯誤而將用戶重定向到new操作。

如果已經從require_user調用了store_location ,它也會跳過。

重定向成功后,您必須從會話哈希中刪除 return_to對; 將其設置為nil是不夠的:

  # application_controller.rb
  def redirect_back_or_default(default)
    redirect_to(session.delete(:return_to) || default)
  end

我添加了一個store_referrer_location來使其工作:

# application_controller.rb
class ApplicationController < ActionController::Base
  private

  def store_referrer_location
    session[:return_to] = request.referrer
  end
end

# user_sessions_controller.rb
class UserSessionsController < ApplicationController
  def new
    store_referrer_location if session[:return_to].blank?
    @user_session = UserSession.new
    @header_title = "Login"
  end

  ...

  def destroy
    store_referrer_location if session[:return_to].blank?
    current_user_session.destroy
    flash[:success] = "Logout successful!"
    redirect_back_or_default root_url
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM