我正在尝试使用session[:user.return_to]
,但没有成功......
我的代码:
def after_sign_in_path_for(resource)
(session[:"user.return_to"].nil?) ? "/" : session[:"user.return_to"].to_s
end
所以,问题是:当我检查我的会话变量时,我没有任何这些名称。
我希望在重定向到登录页面之前进入我正在处理的页面。
答案 0 :(得分:3)
遇到同样的问题。到目前为止,我有一个解决方案......
在我的application_controller.rb
中 before_filter :set_page # at the top and then
protected
def set_page
unless request.referer.include?('/users/sign')
session[:return_to] = request.referer
end
end
除非声明是为了防止用户返回登录或退出页面。我不喜欢这里的网址是硬编码的,所以我希望看到更好的解决方案。此外,似乎before_filter永远不会发生在重定向到登录页面的页面上,因此如果您点击需要登录的内容,登录后您将被带回到您点击该链接的页面,而不是实际链接本身。
答案 1 :(得分:2)
有几种方法可以解决这个问题。
使用Devise的新版本(我在2.1.2上),将before_filter :authenticate_user!
添加到控制器将自动为您设置此行为。
如果你仍想手动设置它,一种方法是在session
中设置路径。 Devise希望在session["#{resource}_return_to"]
中找到它,其中'resource'是您的用户模型的名称。通常这是session["user_return_to"]
。你有一段时间'。'在您的版本中,这可能导致您的错误。此外,session
接受键的字符串值,因此无需尝试对其进行符号化。
另一种方法是像你一样覆盖after_sign_in_path_for(resource)
方法。有关如何在设计维基How To: Redirect back to current page after sign in上执行此操作的更多详细信息。
最后,由于这会发出重定向,因此您可能需要考虑使用完整的网址。
def after_sign_in_path_for(resource)
session["#{resource}_return_to"] || root_url
end
答案 2 :(得分:0)
您需要在重定向某人之前定义会话变量。
session[:url_back] = "/***
答案 3 :(得分:0)
答案 4 :(得分:0)
def after_sign_in_path_for(resource)
sign_in_url = url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => 'http')
if request.referer == sign_in_url
super
else
stored_location_for(resource) || request.referer || root_path
end
end
stored_location_for(resource)是Devise的内置方法,用于存储用户来自的位置。