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

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

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

before_filter :authenticate_user! 

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

通过RDOC for Devise,我发现这个方法看起来好像Devise至少有能力独自完成这样的事情,但我无法找到方法。

好的,所以我做了一些实验,并且使用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 

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

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

这样做的简单方法:

 # 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 

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

 sign_in @user 

这应该重定向你

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

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