登录或注册后如何让Devise重定向到存储位置?

时间:2011-03-10 03:57:19

标签: ruby-on-rails authentication devise

我正在编写一个Rails应用程序中使用Devise,我想让用户在登录或注册后回到原来的位置。

例如,如果我有一个受以下保护的“评论”控制器:

before_filter :authenticate_user!

然后我想要点击“立即评论”的用户!按钮(因此重定向到CommentsController中的新操作)登录,然后让Devise将它们重定向到CommentsController中的新操作(或者它们在哪里),而不是应用程序的通用根,或者通用的after_sign_in_path。

通过RDOC for Devise,我发现this method看起来好像Devise至少有功能可以自己做这样的事情,但我不能想出办法。

5 个答案:

答案 0 :(得分:9)

好的,所以我做了一些实验,并且使用Kormie的信息,我有一个可行的解决方案。

根据我的判断,before_filter authenticate_user! 保存退回用户的路线。我做的是这个:

首先,我在控制器顶部添加了额外的before_filter

before_filter :store_location
before_filter :authenticate_user!

然后,我在控制器底部写了store_location方法

private

  def store_location
    session[:user_return_to] = any_old_route_path
  end

我并不认为这是完美的,但它对我有用。 (其他任何想要使用它的人的缺点是,它只支持每个控制器一个返回路径。这就是我自己所需要的,但它只比我之前使用的每个应用程序的一个返回路径略有改进。我真的很感激别人的见解和建议。

答案 1 :(得分:1)

设计应该自己做。 authenticate_user!当通过PUT方法设置到行动的路线时,过滤器也不想为我工作。当我在routes.rb中将其更改为GET时,开始按预期工作。

答案 2 :(得分:1)

执行此操作的简单方法:

# Modified from https://github.com/plataformatec/devise/wiki/How-To:-redirect-to-a-specific-page-on-successful-sign-in
class ApplicationController < ActionController::Base
  def after_sign_in_path_for(resource)
    stored_location_for(resource) || your_defaut_path 
  end
end

答案 3 :(得分:0)

我认为默认情况下,Devise会保存路线,但您可能正在使用

sign_in @user

这应该重定向你

sign_in_and_redirect(@user) #assuming you are sigining in that resource

答案 4 :(得分:0)

你试过after_sign_in_path_for吗?如果在ApplicationController中定义该方法,它应该基于每个控制器覆盖默认实现。

相关问题