我正在使用Rails上的Devise,想知道是否有钩子或过滤器可以用来在Devise的用户注册过程中添加一些代码,并在账户创建后向用户发送欢迎电子邮件。如果没有Devise,就像这样...
respond_to do |format|
if @user.save
Notifier.welcome_email(@user).deliver # <=======
...
我正在使用Rails上的Devise,想知道是否有钩子或过滤器可以用来在Devise的用户注册过程中添加一些代码,并在账户创建后向用户发送欢迎电子邮件。如果没有Devise,就像这样...
respond_to do |format|
if @user.save
Notifier.welcome_email(@user).deliver # <=======
...
#registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
def create
super
UserMailer.welcome(resource).deliver unless resource.invalid?
end
end
2)告诉Devise你重写了它的Registrations控制器:
# routes.rb
devise_for :users, controllers: { registrations: "registrations" }
@user
是可用的? - Jonathan Linhttps://dev59.com/iW455IYBdhLWcg3wFP9u#6133991 展示了一个不错的答案(虽然并非完美),但至少比我在这里看到的更好。它覆盖了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
after_save
方法,该方法将调用通知。您只需要创建观察者类,然后修改应用程序配置以注册观察者即可。文档描述了这个过程非常好。自从一段时间以前,yield
已经被添加到Devise控制器方法中,我认为这现在可能是最好的方法。
class RegistrationsController < Devise::RegistrationsController
def create
super do |resource|
Notifier.welcome_email(resource).deliver if resource.persisted?
end
end
end