![](/img/trans.png)
[英]Using Rails and Devise, I want to send a welcome email on sign up.
[英]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.