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通常注册后自动登录,不启用确认)。

我试过的其他事情……

  1. 将after_sign_up_path_for(资源)移动到应用程序控制器中。 不起作用。 奇怪的是,使用after_sign_in_path_for(资源)执行相同操作并以用户身份登录重定向。

  2. 将registrations_controller.rb从/ app / controllers /移动到/ app / controllers / users文件夹并相应地更新所有路由/引用/等。 不行。

  3. 将Devise的registrations_controller.rb复制到我自己的registrations_controller.rb中。 没有工作,只是抛出一个错误,我把它全部卷回来。

  4. 我尝试了def after_inactive_sign_up_path_for(资源),因为我认为这个帐户不活跃的事实可能是罪魁祸首。 这也被忽略了。

  5. 值得一提的是,在这些重大变化之后,我尝试重新启动我的项目,但没有任何需要。

有没有人在启用确认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