Rails 3和Devise:在注册后重定向到页面(可确认)

15

我有一个启用了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视图文件夹中移出,移到顶层的/app/views文件夹下,因为会返回一个错误,说这些视图现在已经丢失了。不管怎样,尽管控制器覆盖似乎工作正常(否则视图最初不会破坏),但这些方向并不起作用......页面忽略了after_sign_up,并在注册后返回到登录页面。

我在互联网上寻找方法,包括其他Stack Overflow线程,但我发现没有任何方法可行...要么回答混淆了重定向注册和登录,要么他们实际上正在更改注册后的重定向(因为Devise在启用confirmable时通常会自动进行注册但不需要确认)。

我尝试过的其他事情...

1. 将 after_sign_up_path_for(resource) 移动到application控制器中。不起作用。奇怪的是,使用 after_sign_in_path_for(resource) 并使用用户签入确实会重定向。
2. 将 registrations_controller.rb 从 /app/controllers/ 移到 /app/controllers/users 文件夹中,并相应更新所有路由/引用/等。无法进行。
3. 将 Devise 的 registrations_controller.rb 复制到我的 custom_registrations_controller.rb 中。不起作用,只是抛出一个错误,我把它全部回滚了。
4. 我尝试使用 def after_inactive_sign_up_path_for(resource),因为我认为帐户尚未激活可能是元凶,但也被忽略了。
5. 还值得一提的是,我尝试在这些重大更改后重新启动我的项目,但仍然没有解决问题。

有人成功地在启用 confirmable 的情况下做到这一点吗?
3个回答

14

我只是将@Shannon的评论转化为答案以便更容易找到。

如果您在注册后需要进行电子邮件确认,则用户将处于已注册但尚未点击发送到他们电子邮件中的链接以确认其帐户的状态。这是一种非活动注册状态。要在此情况下进行重定向,您需要指定:

def after_inactive_sign_up_path_for(resource)
  "http://example.com"
end

11
你使用的devise版本是哪个?我相信这个问题最近已得到解决,所以你可能需要从仓库获取最新版本,它仍然是一个发布候选版(尽管它应该很快就会发布,因为他们正在等待omniauth 0.2退出beta,这已经发生了)。
我正在使用带有rails 3.0.5的github repo中的Devise 1.2.rc2。我将你提到的代码添加到我的自定义RegistrationsController中,并在创建新帐户后如预期地被转发到谷歌。
我的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"

如果您在最新版本的Devise上遇到问题,请告诉我。


我之前一直在使用 Devise 1.1.8,没有考虑更新 gem。不过,我现在已经将 Devise 更新到了 1.2.1(同时也更新了 Rails 3.0.5 和所有其他的 gems),但它仍然拒绝重定向,只会回到主页并显示“您已成功注册。但是,我们无法登录您的帐户,因为您的帐户未经确认。”这个新消息对我来说很新奇,但我猜想他们在 Devise 的更新中添加了这个功能。我的代码看起来和你的完全一样。但是上面的 'after_sign_up_path_for' 是我在我的 RegistrationsController 中唯一的内容,这样就足够了吗?还是我需要在控制器中添加更多内容? - Shannon
另外,我也在我的Gemfile中加入了上述内容,并尝试使用Devise 1.3.0.dev版本,但仍然忽略了我的控制器重定向。 - Shannon
6
等等,我想我明白了。我将 "after_sign_up_path_for" 替换为 "after_inactive_sign_up_path_for",现在它正在重定向到 Google。因此,最终答案是这个,并且像上面建议的那样更新 gem。非常感谢。 - Shannon
这对我来说可行,但由于它是一种常见的模式,应该更容易些。 - Sucrenoir

1

另一种方法是在应用控制器中执行此操作。

def after_sign_in_path_for(resource)
  resource.sign_in_count <= 1 ? '/edit_profile' : root_path
end

它对我有效,谢谢 :) - miguel savignano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接