5

ログイン前にアクセスしようとしていたページにユーザーをリダイレクトしようとしています (ページはユーザーのみが表示できます)。

旅行の新しいアクションを対象とする before フィルターから始めます。

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

def authenticate
  deny_access unless signed_in?
end 

def deny_access
  store_location
  redirect_to login_path, :notice => "Please log in to access this page."
end

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

これが、私の sessions_controller.rb の new および create アクションです。

def new
  @title = "Log in"
end

def create
  user = User.authenticate(params[:session][:email].downcase, 
                           params[:session][:password])     
  if user.nil?
    flash.now[:error] = "Invalid email/password combination."
    @title = "Log in"
    render 'new'
  else
    sign_in user
    redirect_back_or(root_path)
  end
end

def redirect_back_or(default)
  redirect_to(session[:return_to] || default)
  clear_return_to
end

ありがとう!

編集:私のコードのMaddHackerのバージョンを削除しました。それは私が望むものではないからです。

4

2 に答える 2

4

私は通常、 before_filter のように使用します

def login_required
  session[:return_to] = request.fullpath
  redirect_to(login_page_url)
end

次に、ログインが完了したら、セッションで return_to を探します。

def login
  # user validation of login here
  url = session[:return_to] || root_path
  session[:return_to] = nil
  url = root_path if url.eql?('/logout')
  logger.debug "URL to redirect to: #{url}"
  redirect_to(url)
end
于 2012-05-10T17:29:03.470 に答える
0

まず、不正なページからログイン ページにリダイレクトする前に、store_return_to メソッドを呼び出す必要があります。def redirect_back_or_default(default = root_path)次に、メソッドの説明を次のように変更して、引数がオプションになるようにする必要があると思います。

ちなみに、メソッド自体にハードコーディングできるデフォルト値にすぎない場合、なぜそのメソッドに引数を渡す必要があるのか​​ 本当に理解できません。

于 2012-05-10T17:27:51.157 に答える