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

pic*_*rdo 23 ruby-on-rails registration devise

我正在使用Devise on Rails,我想知道是否有一个钩子或过滤器可用于向Devise的用户注册过程添加一些代码,并在创建帐户后向用户发送欢迎电子邮件.如果没有设计,那将是这样的......

  respond_to do |format|
      if @user.save
        Notifier.welcome_email(@user).deliver    # <======= 
  ...   
Run Code Online (Sandbox Code Playgroud)

Arc*_*lye 32

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

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

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

#registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController

  def create
    super
    UserMailer.welcome(resource).deliver unless resource.invalid?
  end

end
Run Code Online (Sandbox Code Playgroud)

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

# routes.rb
devise_for :users, controllers: { registrations: "registrations" }
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这种方法,它很干净,不需要太多代码,而且它的逻辑很明显.谢谢你的回答! (2认同)

Dav*_* J. 10

/sf/answers/429379401/显示了一个不错的(不完美)答案,但至少比我在这里看到的要好.它覆盖了该confirm!方法:

class User < ActiveRecord::Base
  devise # ...
  # ...
  def confirm!
    welcome_message # define this method as needed
    super
  end
  # ...
end
Run Code Online (Sandbox Code Playgroud)

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

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


pic*_*rdo 8

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

  after_create :send_welcome_mail
  def send_welcome_mail
     Contact.welcome_email(self.email, self.name).deliver
  end
Run Code Online (Sandbox Code Playgroud)

  • picardo:实际上只检查它是否已经确认.我不得不覆盖确认!方法:https://github.com/plataformatec/devise/issues/812#comment_1113176 (2认同)

Rob*_*rco 6

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

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