2

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_pa​​th」にリダイレクトされるので、以前のオプションが機能していないことがわかりました。jquery で作成したドロップダウン ログイン フォームである「else」ケースは、ユーザーを前のページに完全にリダイレクトしますが、request.referer を「request.referer==sign_in_url」ケースに入れようとすると、私に無限ループを与えます。

ユーザーが「users/sign_in」URLからログインした場合でも、ユーザーを前のページにリダイレクトするにはどうすればよいですか??

4

2 に答える 2

0

この返信は、devise を使用し、同じ OP の問題を抱えている将来の世代に対処してい#stored_location_forます。ユーザーがサインイン ページにリダイレクトされる前に到達したかったパスを返す

于 2016-02-01T15:14:51.553 に答える
0

sign_in_urlはログインしていないユーザーのみを受け入れることを意図しており、アプリにログインした後、ログインしているユーザーをそのページに送り返すため、単純にリダイレクトすることはできません。

ログイン後にユーザーを特定の場所にリダイレクトする必要がある場合は、ログインページにリダイレクトする前にユーザーが行こうとした元の場所を保存し、ログイン後に、ユーザーがログイン後に別の場所に移動する必要があるかどうかを確認する必要があります、そして彼をそこにリダイレクトします。

于 2012-07-06T12:00:48.783 に答える