Подтвердить что ты не робот

Как отправить приветственное письмо новым зарегистрированным пользователям в Rails с помощью Devise?

Я использую Devise on Rails, и мне интересно, есть ли крючок или фильтр, который я могу использовать, чтобы добавить немного кода для разработки процедуры регистрации пользователя и отправить приветственное письмо пользователю после того, как была установлена ​​учетная запись создано. Без Devise это будет что-то вроде этого...

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

Ответ 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