在我的应用程序中,我试图强制用户登录以执行某些操作。当他们在未签名时尝试执行这些操作时,会将其重定向到“登录”页面,一旦他们登录,他们就会被重定向回他们尝试访问的页面。我使用下面的代码完成了所有这些工作。
控制器代码
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]变量会重置?
答案 0 :(得分: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]
以获取所需的路径。
答案 1 :(得分:0)
这是你正在寻找的吗?
redirect_to request.referrer