Facebook認証にDeviseとOmniauthを使用しています。ユーザーがDevise(通常)またはOmniauth(fb)でログインした後、ユーザーを前のページにリダイレクトしようとしています。
ユーザーがナビゲーションバーでドロップダウンログインを使用すると「request.referer」が機能しますが、ユーザーが「http://localhost:3000/users/sign_in」URLからログインしようとすると、「request.referer」が返されます無限ループエラー。
これがシーケンスです。問題は (d) にあります。(a) ログインしていないユーザーが [ミッションに投票] をクリックします。(b) 「before_filter :authenticate_user!」により、ユーザーは「users/sign_in」URL にリダイレクトされます。ミッションコントローラーで。(c) ユーザーは、ユーザー名/pword を入力するか、Facebook アイコンをクリックしてサインインします。(d) VoteUp 機能が完了した状態でユーザーを前のページにリダイレクトする必要がありますが、代わりにルーティング エラーが発生します => 戻ってページを更新すると、ユーザーはサインインしているため、ルーティングの問題であることがわかります
MissionsController.rb
class MissionsController < ApplicationController
before_filter :authenticate_user!, :except => [:show, :index]
def vote_for_mission
@mission = Mission.find(params[:id])
if @mission.voted_by?(current_user)
redirect_to request.referer, alert: 'You already voted on this mission.'
else
@mission.increment!(:karma)
@mission.active = true
@mission.real_author.increment!(:userpoints) unless @mission.real_author.blank?
current_user.vote_for(@mission)
redirect_to request.referer, notice: 'Your vote was successfully recorded.'
end
end
アプリケーションコントローラー.rb
class ApplicationController < ActionController::Base
protect_from_forgery
def after_sign_in_path_for(resource)
sign_in_url = "http://localhost:3000/users/sign_in" || "http://onvard.com/users/sign_in" ||
"http://www.onvard.com/users/sign_in" #url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => 'http')
if (request.referer == sign_in_url)
env['omniauth.origin'] || request.env['omniauth.origin'] || stored_location_for(resource) || getting_started_path || root_path
else
request.referer
end
end
ユーザーは「getting_started_path」にリダイレクトされるので、以前のオプションが機能していないことがわかりました。jquery で作成したドロップダウン ログイン フォームである「else」ケースは、ユーザーを前のページに完全にリダイレクトしますが、request.referer を「request.referer==sign_in_url」ケースに入れようとすると、私に無限ループを与えます。
ユーザーが「users/sign_in」URLからログインした場合でも、ユーザーを前のページにリダイレクトするにはどうすればよいですか??