5

Devise 経由でログインに成功した後、ユーザーを元のページにリダイレクトするにはどうすればよいですか?

私はすでにたくさん読んで検索しましたが、定義する必要があることを理解していますafter_sign_in_path_for。私はこれを実行し、正しく機能していますが、前のページがどのように保存されているか、およびそれを正しく呼び出す方法を理解するのに問題があります。

セッションコントローラーにこれがあります:

def after_sign_in_path_for(resource)
    return request.env['omniauth.origin'] || session[:user_return_to] || root_path
end

私も試してみました

...
return request.env['omniauth.origin'] || stored_location_for(resource) || root_path
...

ユーザーがクリックしてログインするとルートパスにリダイレクトされるため、場所を保存する方法を理解していないと思います。

サインインは 2 つの方法で開始できます。(a) ユーザーが制限されたビューにアクセスしようとする (つまりbefore_filter :authenticate_user!...、その場合、ユーザーはリダイレクトされ、ログインするように求められます。または、(b) ユーザーがログインしていない場合は、すべてのページで利用可能なサインイン リンクをクリックします。 .

(a) 動作しているようです。(b) そうではありません。ユーザーがログインリンクをクリックしたときに、現在の場所をセッションに保存する必要があると思います。

どうすればいいですか?または、これを理解するのに役立つ優れた情報源はどこですか。

ありがとう!

4

4 に答える 4

9

request.referrerこの SO の質問で説明されているように、以前の URL を取得できます: Ruby On Rails で前のページにリダイレクトする方法は?

于 2012-05-17T06:51:25.027 に答える
4

使用する

redirect_to request.referrer
于 2012-05-17T06:53:09.300 に答える
0

ここに別のアプローチがあります。この「戻る」機能を特定のリンクでのみ有効にしています ( continueURL パラメーターを使用)。以下の例では、-params[:continue]に割り当てる前に汚染チェックを行っていますが、権限があれば不要かもしれません。最後に、メソッドのオーバーライドで、それを使用している間に削除します(その後は必要ないため) - キーと値のペアを削除すると、キーが一致する場合は値が返され、そうでない場合はステートメントがフォールバックされます。session[:continue]after_actionafter_sign_in_path_for session[:continue]nilroot_path

アプリ/ビュー/ジャーナル/show.html.erb

<%= link_to 'sign in', new_user_session_path(continue: journal_url(@journal)) %> or
<%= link_to 'sign up', new_user_registration_path(continue: journal_url(@journal)) %>

アプリ/コントローラー/application_controller.rb

after_action :store_location

def store_location
    if params[:continue] =~ /\/(journal\/[0-9]+|foo|bar)\z/ # safelist
        session[:continue] = params[:continue]
    end
end

def after_sign_in_path_for(resource)
    session.delete(:continue) || root_path
end
于 2014-03-06T20:58:45.033 に答える