簡體   English   中英

如何使用Devise向Rails中的新注冊用戶發送歡迎電子郵件?

[英]How can I send a welcome email to newly registered users in Rails using Devise?

我正在使用Devise on Rails,我想知道是否有一個鈎子或過濾器可用於向Devise的用戶注冊過程添加一些代碼,並在創建帳戶后向用戶發送歡迎電子郵件。 如果沒有設計,那將是這樣的......

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

下一個最受歡迎的答案假設您正在使用Devise的:確認模塊,我不是。

我不喜歡其他解決方案,因為你必須使用模型回調,即使你在控制台或管理界面中創建他的帳戶,也會發送歡迎電子郵件。 我的應用程序涉及從CSV文件批量導入用戶的功能。 我不希望我的應用程序逐個向所有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方法的類。 您需要做的就是創建觀察者類,然后修改應用程序配置以注冊觀察者。 文檔很好地描述了該過程。

使用觀察者模式意味着您無需更改控制器中的任何邏輯。

由於一段時間后,Devise控制器方法已經添加了一個yield ,我認為這可能是最好的方法。

class RegistrationsController < Devise::RegistrationsController

  def create
    super do |resource|
      Notifier.welcome_email(resource).deliver if resource.persisted?
    end  
  end

end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM