2010-11-10 65 views
23

我正在使用Devise on Rails,我想知道是否有一個掛鉤或過濾器,我可以使用它來添加一些代碼給Devise的用戶註冊過程,並在帳戶創建後向用戶發送歡迎電子郵件。沒有設計它會是這樣的...如何使用Devise向Rails中的新註冊用戶發送歡迎郵件?

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

您是否使用Devise的可確認方法? – Shreyas 2010-11-10 03:41:02

+0

有趣的你應該問,因爲我遇到了這種方法的麻煩。即使我的配置正常,它也不會發送電子郵件。不,對於我使用我自己的方法的歡迎電子郵件。 – picardo 2010-11-10 03:58:01

回答

8

我使用回調方法解決了這個問題。這不是最乾淨的解決方案,不像觀察員那樣乾淨,但我會接受。我很幸運Mongoid實現了ActiveRecord回調!

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

如何在「確認帳戶後」發送歡迎消息? (在restful_authentication中有一種方法叫recent_activated?) – 2011-05-06 19:06:37

+0

Devise中有類似的方法。 http://rubydoc.info/github/plataformatec/devise/master/Devise/Models/Confirmable#confirmed%3F-instance_method – picardo 2011-05-06 19:52:28

+2

picardo:其實只有檢查它是否被確認。我不得不實際覆蓋確認!方法:https://github.com/plataformatec/devise/issues/812#comment_1113176 – 2011-05-06 20:13:24

6

我會推薦使用ActiveRecord::Observer。與觀察者的想法是,你將創建一個類將調用通知after_save方法。所有你需要做的就是創建觀察者類,然後修改應用程序配置來註冊觀察者。文檔很好地描述了這個過程。

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

+0

我正在使用Mongoid。是否仍然可以使用ActiveRecord觀察器? – picardo 2010-11-10 02:59:46

+0

看着http://blog.eizesus。com/2010/03/creation-a-rails-authentication-system-on-mongoid-part-2-7-3-2010 /似乎沒有觀察員的支持。您的after_create回電似乎對我來說似乎是最好的方式 – 2010-11-11 02:29:26

10

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)將過多的邏輯放入模型中。過度使用它們通常意味着您在其他地方的模型中有行爲。有關此的更多討論,請參閱:Pros and cons of using callbacks for domain logic in Rails

上面的方法與confirm!方法聯繫在一起,這個方法比這個例子的回調更可取。儘管如此,這個邏輯仍然在模型中。 :(所以,我沒有找到辦法完全令人滿意

+0

我不知道這可能會更好,因爲郵件程序是控制器的一部分,而不是模型。更簡單,但錯誤。 – 2015-01-30 12:28:12

33

下一個最普遍的回答假設你使用設計的使用:。可證實模塊,我不

我沒有其他的像因爲您必須使用模型回調,即使在控制檯或管理界面中創建其帳戶時,它也會始終發送歡迎電子郵件。我的應用程序涉及從CSV文件批量導入用戶的功能,我不希望我的應用程序發送驚喜電子郵件給他們所有3000個人,但我確實希望創建自己的帳戶的用戶獲得歡迎的電子郵件。 解決方案:

1)覆蓋設計的註冊cont輥:

#registrations_controller.rb 
class RegistrationsController < Devise::RegistrationsController 

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

end 

2)告訴制定你推翻了其註冊記憶控制器:

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

我喜歡這種方式,它很乾淨,不需要太多的代碼,它的邏輯很明顯。感謝這個答案! – asfallows 2013-08-26 20:55:54

+1

這似乎是最好的解決方案。 – 2013-09-06 14:41:07

+0

你怎麼知道'@ user'可用? – 2014-11-07 16:10:21

2

由於yield已被添加到設計控制器方法而回,我覺得這是現在可能是最好的辦法去做吧。

class RegistrationsController < Devise::RegistrationsController 

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

end 
相關問題