3

Devise で作成した特定のフォームにユーザーがログインしたときに、ユーザーを特定のページにリダイレクトするにはどうすればよいですか? サインイン後に特定のページにリダイレクトする方法については、Devise のこのハウツー ページがあります。ただし、さまざまなフォームでさまざまなターゲット ページにサインインしたいと考えています。理想的には、次のような別の HTML フォーム パラメータを追加するだけです。

<input type="hidden" name="target" value="/dashboard"/>

更新:ログインページのDeviseの通常の機能を維持することが重要です。つまりbefore_filter :authenticate_user!、コントローラに があるリンクをクリックすると、ログイン ページにリダイレクトされます。ログインすると、元の宛先ページにリダイレクトされます。

4

1 に答える 1

5

after_sign_in_path_for実際には、次のようにコントローラーでメソッドを簡単に定義できます。

class ApplicationController < ActionController::Base

  def after_sign_in_path_for
    params[:target] || some_default_url
  end

end

そして、異なるサインインフォームに異なるターゲットがある場合、ユーザーは適切にリダイレクトされる必要があります

追加する

<input type="hidden" name="target" value="/dashboard"/>

特定のページにリダイレクトする特定のフォームごとに十分です:)

編集:あなたが正確に何を望んでいるのか、ようやく理解できたと思います。だからここで私は何をしますか(このブログ投稿に基づいて)

class ApplicationController < ActionController::Base
  protect_from_forgery

  def after_sign_in_path_for(user)
    origin_path = session[:origin_path]
    clear_origin_path
    if origin_path.present?
      origin_path
    else
      params[:target].presence || default_redirect_path
    end
  end

  private

  def authenticate_user!
    store_origin_path
    super
  end

  def store_origin_path
    session[:origin_path] = request.fullpath
  end

  def clear_origin_path
    session[:origin_path] = nil
  end

end

したがって、基本的に、保護されたパス (たとえば ) にアクセスしようとすると/protected_resource、パスがセッションに保存され、ユーザーがログインすると、セッションがクリアされ、ユーザーが正しくリダイレ​​クトされます。

次に、ユーザーが別のsign_inフォームのいずれかに移動し、そのフォームにtarget入力が含まれている場合、ユーザーはそのターゲットにリダイレクトされます。

最後に、ユーザーがターゲットなしでフォームに移動すると、default_redirect_pathカスタマイズしたい にリダイレクトされます。

最後に : 元のリクエストへのリダイレクトがターゲットよりも重要であると想定したため、ユーザーが続行し/protected_resourceて sign_in フォームにリダイレクトされたとします。この sign_in フォームには入力targetがあり、ユーザーは/protected_resourceサインイン成功。

after_sign_in_path_forメソッドの条件を反転することで簡単に変更できます

それを行うためのより良い方法があるかもしれませんが、これはあなたにとっての出発点であり、改善したいと思うかもしれません;)

私の答えが十分に詳細でない場合はお知らせください。

于 2012-10-29T20:42:48.980 に答える