Как отправить приветственное письмо новым зарегистрированным пользователям в Rails с помощью Devise?
Я использую Devise on Rails, и мне интересно, есть ли крючок или фильтр, который я могу использовать, чтобы добавить немного кода для разработки процедуры регистрации пользователя и отправить приветственное письмо пользователю после того, как была установлена учетная запись создано. Без Devise это будет что-то вроде этого...
respond_to do |format|
if @user.save
Notifier.welcome_email(@user).deliver # <=======
...
Ответы
Ответ 1
Я решил это с помощью метода обратного вызова. Это не самый чистый из решений, не такой чистый, как наблюдатель, но я возьму его. Мне повезло, что Mongoid реализовал обратные вызовы ActiveRecord!
after_create :send_welcome_mail
def send_welcome_mail
Contact.welcome_email(self.email, self.name).deliver
end
Ответ 2
Следующий наиболее популярный ответ предполагает, что вы используете модуль Devise: confirmable, которого я не знаю.
Мне не нравились другие решения, потому что вы должны использовать обратные вызовы модели, которые всегда будут отправлять приветственные сообщения даже при создании своей учетной записи в консоли или в интерфейсе администратора. Мое приложение включает возможность массового импорта пользователей из файла CSV. Я не хочу, чтобы мое приложение отправляло неожиданное письмо всем 3000 из них по одному, но я хочу, чтобы пользователи, которые создали свою собственную учетную запись, получили приветственное письмо.
Решение:
1) Контроллер регистрации переопределения:
#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" }
Ответ 3
fooobar.com/questions/233093/... показывает достойный (не идеальный) ответ, но, по крайней мере, лучше, чем я вижу здесь. Он отменяет метод confirm!
:
class User < ActiveRecord::Base
devise # ...
# ...
def confirm!
welcome_message # define this method as needed
super
end
# ...
end
Это лучше, потому что он не использует обратные вызовы. Обратные вызовы невелики в той мере, в какой они (1) затрудняют тестирование моделей; (2) вкладывают слишком много логики в модели. Их чрезмерное использование означает, что вы имеете поведение в модели, которая принадлежит где-то еще. Подробнее об этом см.: Плюсы и минусы использования обратных вызовов для логики домена в Rails.
Вышеупомянутый подход связан с методом confirm!
, который предпочтительнее обратного вызова для этого примера. Однако, как и обратный вызов, логика все еще находится в модели.:( Так что я не нашел подход полностью удовлетворительным.
Ответ 4
Я бы рекомендовал использовать ActiveRecord:: Observer. Идея с наблюдателем заключается в том, что вы создадите класс с помощью метода after_save
, который будет вызывать уведомление. Все, что вам нужно сделать, это создать класс наблюдателя, а затем изменить конфигурацию приложения для регистрации наблюдателя. Документация описывает процесс достаточно хорошо.
Использование шаблона наблюдателя означает, что вам не нужно менять какую-либо логику в контроллере.
Ответ 5
Так как a yield
был добавлен в методы контроллера Devise некоторое время назад, я думаю, что теперь это, вероятно, лучший способ сделать это.
class RegistrationsController < Devise::RegistrationsController
def create
super do |resource|
Notifier.welcome_email(resource).deliver if resource.persisted?
end
end
end