如何从DEVISE使用session [:user.return_to]

时间:2011-03-03 20:33:56

标签: ruby-on-rails-3 session login devise

我正在尝试使用session[:user.return_to],但没有成功......

我的代码:

def after_sign_in_path_for(resource)
  (session[:"user.return_to"].nil?) ? "/" : session[:"user.return_to"].to_s
end

所以,问题是:当我检查我的会话变量时,我没有任何这些名称。

我希望在重定向到登录页面之前进入我正在处理的页面。

5 个答案:

答案 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)

在ApplicationController.rb中

 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的内置方法,用于存储用户来自的位置。