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
メソッドの条件を反転することで簡単に変更できます
それを行うためのより良い方法があるかもしれませんが、これはあなたにとっての出発点であり、改善したいと思うかもしれません;)
私の答えが十分に詳細でない場合はお知らせください。