2014-04-22 64 views
0

在我的应用程序中,我试图强制用户登录以执行某些操作。当他们尝试在未签名时执行这些操作时,他们将被重定向到“登录”页面,并且一旦他们登录,他们就会重定向到他们尝试访问的页面。我用下面的代码正确地工作。Rails - 正确重定向到上一页

控制器代码

if !(signed_in?) 
    session[:return_to] = newcompany_path 
    redirect_to signin_path 
    flash[:notice] = "You must be signed in to add companies." 
else 
     @company = Company.new 
    @primary_field = @@fields 
end 

... 

redirect_path = session[:return_to] 
if user && user.authenticate(params[:session][:password]) 
    sign_in user 
    session[:return_to] = nil 
    if (redirect_path == nil) 
     redirect_to user 
    else 
     redirect_to redirect_path 
    end 
else 

我运行到的是,如果用户点击从登录页面远没有实际登录的session[return_to]变量未正确清除的问题,如果他们然后返回登录,他们被重定向到错误的页面。

那么,我如何设置它,所以如果用户点击远离登录页面,会话[:redirect_to]变量被重置?

回答

2

您可以在查询字符串参数而不是会话中传递return_to路径,并将其与登录表单一起提交,以便它仅适用于该表单,而不是后续请求。

当重定向到形式上的标志,它会看起来像:

redirect_to signin_path(return_to: newcompany_path) 

然后,在你登录表单,确保包括一个隐藏字段与return_to值,如:

hidden_field_tag :return_to, params[:return_to] 

然后在您的控制器登录操作中,您将检查params[:return_to]而不是session[:return_to]以获取所需的路径。

+0

这很美!万分感谢。完美的作品。我没有使用查询字符串参数之前,你有任何机会知道任何地方获得更多的知识这个东西? – Scalahansolo

+0

他们没有什么特别的特别之处。你几乎可以设置任何你想要的键/值(尽管你必须小心使用特殊字符,比如值和中的&),然后服务器可以根据请求使用它们。因此,如果您在Rails中访问像/ foo?bar = 1&baz = rails这样的URL,则会有名为'bar'和'baz'的参数。当您在Rails中生成路径时,Rails无法识别的任何密钥(id,anchor等)都会变成查询字符串。所以'signin_path(return_to:newcompany_path)'会为你提供一个URL/signin?return_to =/companies/new –

0

这是你在找什么?

redirect_to request.referrer