2010-11-10 63 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 
相关问题