我有一点菜鸟问题。我想设计重定向到用户访问的最后一页。所以我做了以下......
def after_sign_in_path_for(resource)
request.referer
end
效果很好......除非用户实际通过原始表单登录导致重定向循环。
我试过
def after_sign_in_path_for(resource)
if (request.referer == "/users/sign_in")
:pages_home
else
request.referer
end
end
但那不起作用,很可能是因为我不知道request.referer在遇到原始用户登录页面(www.example.com/users/sign_in)时实际返回了什么。
有什么想法吗?
tldr;使用devise,我想重定向到从(即/ blog / 4)登录的页面,除非该页面是/ users / sign_in
解决:
Matchu是对的。 request.referer也返回了域名......
http://example.com/users/sign_in
(注意:没有www前缀)
如果它是一种不安全或低效的方式,我仍然对request.referer的替代方案感兴趣。
答案 0 :(得分:12)
答案 1 :(得分:2)
这个怎么样:
def after_sign_in_path_for(resource)
sign_in_url = url_for(:action => 'sign_in', :controller => 'users', :only_path => false, :protocol => 'http')
if (request.referer == sign_in_url)
super
else
request.referer
end
end
答案 2 :(得分:2)
我接受了Justice的回答并改为使用会话。
据我所知,会话更简单,然后将url添加为param,但是当用户在多个选项卡中浏览网站时,它们可能会出现意外情况。使用会话的RESTfull较少,但更简单,更清晰。
使用CanCan时,设置重定向路径可以在一个中心位置完成:处理“拒绝访问”例外的地方:
rescue_from CanCan::AccessDenied do |exception|
if current_user.nil?
session[:next] = request.fullpath
puts session[:next]
redirect_to new_user_session_path, :alert => exception.message
else
render :file => "#{Rails.root}/public/403.html", :status => 403
end
end
但你可以在任何地方设置它,实际上:
def edit
if current_user.roles[:moderator].nil?
session[:next] = "/contact"
redirect_to new_user_session_path, :alert => "please contact the moderator for access"
end
# ...
end
然后,在ApplicationController
中,您可以重复使用该会话值。不过,请务必将其删除。
def after_sign_in_path_for(resource)
path = ''
if session[:next]
path = session[:next]
session[:next] = nil
else
path = super
end
path
end
答案 3 :(得分:0)
以下是rescue_from
CanCan的代码。
rescue_from CanCan::AccessDenied do |exception|
if current_user.nil?
session[:next] = request.fullpath
puts session[:next]
redirect_to login_url, :alert => "You have to be logged in to continue"
else
#render :file => "#{Rails.root}/public/403.html", :status => 403
if request.env["HTTP_REFERER"].present?
redirect_to :back, :alert => exception.message
else
redirect_to root_url, :alert => exception.message
end
end
end
它的作用: - 如果用户未登录,则会重定向到登录页面 - 如果用户已登录但无法查看操作,则会将其重定向回到具有警报闪烁消息的根页面