4

ログインする前にアクセスしようとしていたページにユーザーをリダイレクトしようとしています。ページのユーザーにリダイレクトされたURLは、ログイン前に表示したい

私は新しいアクション私の旅行を対象とフィルタの前から始めましょう:

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でアクション

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バージョンを削除しました。

+0

は、問題を解決しました。ログインページにリダイレクトする前に、私のコントローラの中に 'store_location'を追加するだけです。 – Huy

答えて

3

私のログインが完了したとき、私は通常、私はセッションでreturn_toを探して、次に

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

のようにbefore_filterを使用します。

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 
+0

私はあなたのコードを使ってみました。しかし、私はまだroot_pathにリダイレクトされているので、私のセッション[:return_to]がフルパスを格納していないように見えます。自分のバージョンのコードを自分の投稿に追加しました。 – Huy

+0

また、この方法では、ログインした後でセッションを保存するだけです。 – Huy

+0

logger.debugステートメントを追加してどこに行くのかを確認してください(ログアウトURLをチェックすることをおすすめします。 、再度ログインしようとしています)。ちょうどメモとして、私はあなたがセッション(セキュリティのもの)にユーザーの電子メールアドレスだけを保存し、そのログインをキーすることを提案します。 – MaddHacker

0

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

ところで、私は実際にそのメソッドに引数を渡す必要があるのですが、それがデフォルト値であればメソッド自体をハードコードすることはできません。

+0

ログインページにリダイレクトする前にstore_return_toメソッドを呼び出そうとしましたが、私のデフォルトパスにリダイレクトされます。元の投稿にコードが追加されました。 – Huy

関連する問題