Rails 3和Devise:重定向到注册后的页面(可确认)
我有一个带Devise的Rails 3项目,启用了确认,因此用户必须在注册后通过电子邮件确认他们的帐户。 目前,该项目将用户返回到登录页面并抛出“您已成功注册…”通知。 我想要做的是将它们重定向到“谢谢”页面,并提供进一步说明(检查您的电子邮件,垃圾邮件文件夹,等等)。
我的第一站是Devise wiki,在那里我找到了这个页面 。 看起来很容易,我做了以下改动,并严格按照指示……
/app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController protected def after_sign_up_path_for(resource) "http://google.com" end end
/config/routes.rb
devise_for :users, :controllers => { :registrations => "registrations" }
我必须在方向上进行的一项修改是将“registrations”文件夹移出/ app / views / devise视图文件夹并移至top / app / views文件夹,因为返回的错误现在缺少视图。 无论如何,尽管控制器覆盖似乎工作(我不认为视图原本会破坏),这些方向不起作用…页面忽略after_sign_up并在注册后返回登录页面。
在互联网上搜索包括其他Stack Overflow线程,但我发现的任何内容都没有对我有用…或者回答混淆重定向注册用于登录IN,或者他们实际做的是在登录后改变重定向(正如Devise通常注册后自动登录,不启用确认)。
我试过的其他事情……
-
将after_sign_up_path_for(资源)移动到应用程序控制器中。 不起作用。 奇怪的是,使用after_sign_in_path_for(资源)执行相同操作并以用户身份登录重定向。
-
将registrations_controller.rb从/ app / controllers /移动到/ app / controllers / users文件夹并相应地更新所有路由/引用/等。 不行。
-
将Devise的registrations_controller.rb复制到我自己的registrations_controller.rb中。 没有工作,只是抛出一个错误,我把它全部卷回来。
-
我尝试了def after_inactive_sign_up_path_for(资源),因为我认为这个帐户不活跃的事实可能是罪魁祸首。 这也被忽略了。
-
值得一提的是,在这些重大变化之后,我尝试重新启动我的项目,但没有任何需要。
有没有人在启用确认function的情况下取得成功?
您使用的是哪个版本的设计? 我很确定这个问题最近已经解决,所以你可能需要来自repo的最新版本,它仍然是一个候选发布版本(尽管它应该很快就会出现,因为它们正在等待omniauth 0.2退出最近发生的测试版) 。
我正在使用带有rails 3.0.5的github repo中的Devise 1.2.rc2。 我将您提到的代码添加到我的自定义RegistrationsController中,并在创建新帐户后按预期转发给Google。
我的RegistrationsController的缩减版本(在app / controllers / users中)
class Users::RegistrationsController < Devise::RegistrationsController protected def after_sign_up_path_for(resource) "http://google.com" end end
我的routes.rb条目
devise_for :users, :controllers => { :registrations => "users/registrations" }
从我的Gemfile
gem 'devise', :git => "git://github.com/plataformatec/devise.git"
如果您在最新版本的设备上遇到问题,请告诉我。
我只是将@ Shannon的评论放到答案中,以便更容易找到。
如果您在注册后要求确认电子邮件,则您的用户将处于他们已注册的中间状态,但未点击通过电子邮件发送给他们以确认其帐户的链接。 这是一个不活跃的注册。 要在这种情况下重定向,您需要指定:
def after_inactive_sign_up_path_for(resource) "http://example.com" end
另一种方法是在应用程序控制器中执行此操作
def after_sign_in_path_for(resource) resource.sign_in_count <= 1 ? '/edit_profile' : root_path end