1

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. I'm in posts/1which doesn't require_user.
  2. 上部のナビゲーション バーにあるログイン リンクをクリックします。
  3. ログインページを表示します。
  4. posts/1ログインすると、 の代わりに にリダイレクトされますroot_url
4

2 に答える 2

0

store_locationセッション コントローラnewアクションでを直接呼び出します。

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

return_toこれにより、最初にセッション ハッシュ内の既存のペアがチェックされます。newたとえば、パスワードが間違っているためにユーザーがアクションにリダイレクトされた場合に備えて、上書きしたくありません。

store_locationからすでに呼び出されている場合もスキップしrequire_userます。

リダイレクトが成功したら、セッション ハッシュからペアを削除する必要があります。nilreturn_toに設定するだけでは不十分です。

  # application_controller.rb
  def redirect_back_or_default(default)
    redirect_to(session.delete(:return_to) || default)
  end
于 2013-05-19T02:22:20.767 に答える