如何使用Devise向Rails中的新注册用户发送欢迎电子邮件?

我正在使用Devise on Rails,我想知道是否有一个钩子或filter可用于向Devise的用户注册过程添加一些代码,并在创建帐户后向用户发送欢迎电子邮件。 没有设计就会有这样的事情……

respond_to do |format| if @user.save Notifier.welcome_email(@user).deliver # <======= ... 

下一个最受欢迎的答案假设您正在使用Devise的:确认模块,我不是。

我不喜欢其他解决方案,因为你必须使用模型回调,即使你在控制台或管理界面中创建他的帐户,也会发送欢迎电子邮件。 我的应用程序涉及从CSV文件批量导入用户的function。 我不希望我的应用程序逐个向所有3000个用户发送惊喜邮件,但我确实希望创建自己帐户的用户收到欢迎电子邮件。 解决方案:

1)覆盖Devise的注册控制器:

 #registrations_controller.rb class RegistrationsController < Devise::RegistrationsController def create super UserMailer.welcome(resource).deliver unless resource.invalid? end end 

2)告诉Devise你覆盖其注册控制器:

 # routes.rb devise_for :users, controllers: { registrations: "registrations" } 

https://stackoverflow.com/a/6133991/109618显示了一个不错的(不完美)答案,但至少比我在这里看到的更好。 它超越了confirm! 方法:

 class User < ActiveRecord::Base devise # ... # ... def confirm! welcome_message # define this method as needed super end # ... end 

这样更好,因为它不使用回调。 回调并不是很大,以至于它们(1)使模型难以测试; (2)在模型中加入太多逻辑。 过度使用它们通常意味着您在属于其他地方的模型中有行为。 有关此问题的更多讨论,请参阅: 在Rails中使用域逻辑回调的优缺点 。

以上方法与confirm! 方法,优于此示例的回调。 就像回调一样,逻辑仍然在模型中。 :(所以我没有找到完全令人满意的方法。

我通过使用回调方法解决了这个问题。 这不是最干净的解决方案,不像观察者那样干净,但我会接受它。 我很幸运Mongoid实现了ActiveRecord回调!

  after_create :send_welcome_mail def send_welcome_mail Contact.welcome_email(self.email, self.name).deliver end 

我建议使用ActiveRecord :: Observer 。 观察者的想法是你要创建一个带有调用通知的after_save方法的类。 您需要做的就是创建观察者类,然后修改应用程序配置以注册观察者。 文档很好地描述了该过程。

使用观察者模式意味着您无需更改控制器中的任何逻辑。

由于前一段时间已将一个yield添加到Devise控制器方法中,我认为现在这可能是最好的方法。

 class RegistrationsController < Devise::RegistrationsController def create super do |resource| Notifier.welcome_email(resource).deliver if resource.persisted? end end end