Как я могу отправить приветственное письмо новым зарегистрированным пользователям в Rails с помощью Devise? - PullRequest
23 голосов
/ 10 ноября 2010

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

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

Ответы [ 5 ]

32 голосов
/ 22 февраля 2013

Следующий самый популярный ответ предполагает, что вы используете модуль 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" }
10 голосов
/ 14 октября 2012

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) положить слишком много логики в модели.Чрезмерное их использование часто означает, что у вас есть поведение в модели, которая принадлежит другому.Подробнее об этом см .: Плюсы и минусы использования обратных вызовов для логики домена в Rails .

Приведенный выше подход связан с методом confirm!, который предпочтительнее обратного вызова дляэтот пример.Как и обратный вызов, логика все еще в модели.:( Поэтому я не нахожу подход полностью удовлетворительным.

8 голосов
/ 10 ноября 2010

Я решил это с помощью метода обратного вызова.Это не самое чистое решение, не такое чистое, как у наблюдателя, но я возьму его.Мне повезло, что Mongoid реализовал обратные вызовы ActiveRecord!

  after_create :send_welcome_mail
  def send_welcome_mail
     Contact.welcome_email(self.email, self.name).deliver
  end
6 голосов
/ 10 ноября 2010

Я бы порекомендовал использовать ActiveRecord :: Observer .Идея с наблюдателем состоит в том, что вы создадите класс с after_save методом, который будет вызывать уведомление.Все, что вам нужно сделать, это создать класс наблюдателя, а затем изменить конфигурацию приложения, чтобы зарегистрировать наблюдателя.Документация описывает процесс достаточно хорошо.

Использование шаблона наблюдателя означает, что вам не нужно менять логику в контроллере.

2 голосов
/ 05 декабря 2015

Поскольку yield был добавлен в методы контроллера Devise некоторое время назад, я думаю, что сейчас это, вероятно, лучший способ сделать это.

class RegistrationsController < Devise::RegistrationsController

  def create
    super do |resource|
      Notifier.welcome_email(resource).deliver if resource.persisted?
    end  
  end

end
...