如何在Devise登录后返回上一页

时间:2012-05-17 06:40:47

标签: ruby-on-rails devise

通过Devise成功登录后,如何将用户重定向回他们所在的页面?

我已经阅读和搜索了很多,我知道我需要定义after_sign_in_path_for。我已经完成了这项工作并且工作正常,我遇到的问题是了解上一页的存储方式以及如何正确调用它。

我在会话控制器中有这个:

def after_sign_in_path_for(resource)
    return request.env['omniauth.origin'] || session[:user_return_to] || root_path
end

我也试过

...
return request.env['omniauth.origin'] || stored_location_for(resource) || root_path
...

我不认为我了解如何存储该位置,因为如果用户点击登录,则会将用户重定向回根路径。

登录可以通过两种方式启动。 (a)用户尝试访问受限制的视图(即before_filter :authenticate_user!...,在这种情况下,他们会被重定向并提示登录。或者(b)用户点击登录链接,如果用户未登录。

(a)似乎正在发挥作用。 (b)不是。我想我需要在用户点击登录链接时将当前位置存储到会话。

我该怎么做?或者,哪里有一个很好的信息来源,可以帮助我理解这一点。

谢谢!

4 个答案:

答案 0 :(得分:9)

您可以使用request.referrer获取上一个网址,如此问题中所述:How to redirect to previous page in Ruby On Rails?

答案 1 :(得分:4)

使用

redirect_to request.referrer

答案 2 :(得分:1)

抬头:代码应该放在你的application_controller.rb中,而不是会话控制器。

工作原理是新版本的Devise会自动存储用户尝试访问的初始页面(在重定向到登录之前)。

可以使用设计助手访问:stored_location_for(resource)

您添加到应用程序控制器的内容是这样的:

def after_sign_in_path_for(resource)
  stored_location_for(resource) || users_dashboard_path
  # replace users_dashboard_path by whichever route you want to redirect to after login - default is root_path
end

成功登录后,Devise将自动从应用程序控制器运行您的方法,而不是自己的方法(覆盖它)。

对于一个更复杂的例子,这是来自Devise团队的一个例子:

def after_sign_in_path_for(resource)
  stored_location_for(resource) ||
    if resource.is_a?(User) && resource.can_publish?
      publisher_url
    else
      super
    end
end

我希望这个答案可以帮助任何人搜索如何使用更新版本的设备进行此操作。

答案 3 :(得分:0)

这是另一种方法。我仅在某些链接上启用此“返回”功能(通过continue网址参数)。在下面的示例中,我会在params[:continue] - 中将session[:continue]分配给after_action之前对其进行检查,但如果您已获得授权,则可能不需要这样做。最后,在after_sign_in_path_for方法中覆盖I delete session[:continue]同时使用它(因为之后不需要) - 如果密钥匹配,则删除键/值对将返回值,否则{返回{1}},在这种情况下,语句将返回nil

应用/视图/日记/ show.html.erb

root_path

应用/控制器/ application_controller.rb

<%= link_to 'sign in', new_user_session_path(continue: journal_url(@journal)) %> or
<%= link_to 'sign up', new_user_registration_path(continue: journal_url(@journal)) %>