我正在使用Devise on Rails,我想知道是否有一个钩子或过滤器可以用来向Devise的用户注册过程添加一些代码,并在帐户被用户后向用户发送欢迎电子邮件创建。没有设计就会有这样的事情......
respond_to do |format|
if @user.save
Notifier.welcome_email(@user).deliver # <=======
...
答案 0 :(得分: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
2)告诉Devise你覆盖其注册控制器:
# routes.rb
devise_for :users, controllers: { registrations: "registrations" }
答案 1 :(得分: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!
方法有关,这比本例的回调更可取。就像回调一样,逻辑仍然在模型中。 :(所以我觉得这种方法并不完全令人满意。
答案 2 :(得分:8)
我通过使用回调方法解决了这个问题。这不是最干净的解决方案,不像观察者那样干净,但我会接受它。我很幸运Mongoid实现了ActiveRecord回调!
after_create :send_welcome_mail
def send_welcome_mail
Contact.welcome_email(self.email, self.name).deliver
end
答案 3 :(得分:6)
我建议使用ActiveRecord::Observer。观察者的想法是,您将使用after_save
方法创建一个可以调用通知的类。您需要做的就是创建观察者类,然后修改应用程序配置以注册观察者。文档很好地描述了这个过程。
使用观察者模式意味着您无需更改控制器中的任何逻辑。
答案 4 :(得分:2)
由于前一段时间已将yield
添加到Devise控制器方法中,我认为现在这可能是最好的方法。
class RegistrationsController < Devise::RegistrationsController
def create
super do |resource|
Notifier.welcome_email(resource).deliver if resource.persisted?
end
end
end