2012-07-06 49 views
2

我正在使用Devise和Omniauth进行Facebook身份验证。在用户使用Devise(常规)或Omniauth(fb)登录后,我试图将用户重定向到上一页。设计:认证用户后重定向到上一页? (request.referer结果循环)

“request.referer”在用户使用我的导航栏上的下拉登录名时起作用,但当用户尝试通过“http:// localhost:3000/users/sign_in”url登录时,“request.referer “让我回到无限循环错误。

这是序列。问题在于(d)。 (a)未登录的用户点击为任务投票。 (b)由于“before_filter:authenticate_user!”,用户被重定向到“users/sign_in”url。在任务控制员。 (c)用户通过输入用户名/密码或点击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 

ApplicationsController.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,” 我为这,所以我知道以前的方案并没有工作。 'else'的情况下,我用jQuery创建的下拉式登录表单将用户重定向到上一页,但是当我尝试将request.referer放入'request.referer == sign_in_url'的情况下,它给了我一个无限循环。

即使用户通过'users/sign_in'网址登录,我将如何将用户重定向到上一页?

+0

对Ruby代码的评论:'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')'will自动与'sign_in_url =“http:// localhost:3000/users/sign_in”'相同。 – 2016-02-25 02:58:10

回答

0

您不能简单地重定向回去,因为sign_in_url仅用于接受未登录的用户,登录后应用程序会将登录用户发送回该页面。

如果您需要在登录后将用户重定向到特定的位置,您应该在重定向到登录页面之前存储用户尝试去的原始位置,然后在登录后检查用户是否应该转到不同的位置在登录后放置,并将其重定向到那里。

+0

我明白了 - 所以你说的是重定向返回将用户发送回登录页面。那么有没有办法我可以说“回去2页?”如果不是,我会如何储存原来的地方? – kibaekr 2012-07-06 14:15:52

+0

您可以将它存储在会话或cookie中或任何你想要的。然后,您只需检查该存储是否有内容,如果存在,则重定向到该存储。 – Draiken 2012-07-06 15:48:10

+0

我试图将它存储在会话中,如“session [:user_return_to] = request.referer”,然后尝试在其他地方调用会话[:user_return_to],但它在保存request.referer时不访问该页面。我认为它试图找到它自己的相对要求。当我以不同的行动使用它的时候,引用者;我将如何硬性保存request.referer的url,以便我可以在任何地方使用绝对网址? – kibaekr 2012-07-09 10:43:07

0

我正在回复给使用设计和同样问题OP的后代:你应该能够通过使用#stored_location_for来解决它,它返回用户在被重定向到登录页面。

相关问题