Разработать асинхронные / отложенные задания - отправлять собственные письма с отложенной работой тоже? - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть решение, в котором я могу отправлять «стандартные электронные письма» устройству почтовых сообщений, которые по умолчанию включены в Devise с отложенными заданиями. В асинхронной манере. Поэтому я использую следующий код:

/ Инициализаторы / devise_acync.rb

module Devise


  module Models

    module Confirmable
      alias_method :send_confirmation_instructions_without_delay, :send_confirmation_instructions
      handle_asynchronously :send_confirmation_instructions
    end

    module Recoverable
      alias_method :send_reset_password_instructions_without_delay, :send_reset_password_instructions
      handle_asynchronously :send_reset_password_instructions
    end

    module Lockable
      alias_method :send_unlock_instructions_without_delay, :send_unlock_instructions
      handle_asynchronously :send_unlock_instructions
    end

    module Invitable
      alias_method :deliver_invitation_without_delay, :deliver_invitation
      handle_asynchronously :deliver_invitation
    end


  end

end

В моей пользовательской модели устройство связано с этой моделью Я делаю

def confirm!
    welcome_message
    super
  end

private

  def welcome_message
     ::Devise.mailer.welcome_instructions(self).deliver
  end

Большой вопрос, который держит меня ослепленным: Как я смогу отправить это приветственное сообщение true delayed_job? И как бы вы добавили другие электронные письма, которые являются собственными, а не разработанными, чтобы они тоже отправляли true delayed_job?

Ответы [ 6 ]

3 голосов
/ 10 февраля 2013

Лучше использовать devise-aync драгоценный камень или оформить заказ на этот маленький blogpost

3 голосов
/ 14 марта 2012

Я нашел это элегантным решением - http://danseaver.com/blog/2011/10/18/sending-devise-emails-with-delayed-job

Я немного изменил его, чтобы обрабатывать все исходящие письма от разработчиков, используя rails 3.0.7 + DJ 3.0.1

конфиг / Инициализаторы / devise.rb

# override Devise::Mailer to use queue outgoing mail into DJ
class DeviseMailer < Devise::Mailer

  def confirmation_instructions(record)
    Devise::Mailer.delay.confirmation_instructions(record)
  end

  def reset_password_instructions(record)
    Devise::Mailer.delay.reset_password_instructions(record)
  end

  def unlock_instructions(record)
   Devise::Mailer.delay.unlock_instructions(record)
  end
end

# Use this hook to configure devise mailer, warden hooks and so forth. The first
# four configuration values can also be set straight in your models.
Devise.setup do |config|
  # ==> Mailer Configuration
  # Configure the e-mail address which will be shown in DeviseMailer.
  config.mailer_sender = APP_CONFIG[:member_email]

  # Configure the class responsible to send e-mails.
  config.mailer = "DeviseMailer"
...
1 голос
/ 15 марта 2012

Я обнаружил, что ничего из вышеперечисленного не работает для меня. Я использую Devise 2.0.4 и Rails 3.2.2 с delayed_job_active_record 0.3.2

Способ, которым devise фактически говорит о том, чтобы сделать что-то подобное в комментариях в коде, - переопределить методы в классе User. Таким образом, я решил это так, и он отлично работает:

приложение / модели / User.rb

def send_on_create_confirmation_instructions
  Devise::Mailer.delay.confirmation_instructions(self)
end
def send_reset_password_instructions
  Devise::Mailer.delay.reset_password_instructions(self)
end
def send_unlock_instructions
  Devise::Mailer.delay.unlock_instructions(self)
end
0 голосов
/ 01 июня 2014

(Вопросу уже почти 3 года, но все еще легко найти через Google, так что вот мой вклад)

Рекомендуется следовать инструкциям устройства, как описано в источнике https://github.com/plataformatec/devise/blob/master/lib/devise/models/authenticatable.rb#L129

class User
  devise :database_authenticatable, :confirmable

  after_commit :send_pending_notifications

  protected

  def send_devise_notification(notification, *args)
    # If the record is new or changed then delay the
    # delivery until the after_commit callback otherwise
    # send now because after_commit will not be called.
    if new_record? || changed?
      pending_notifications << [notification, args]
    else
      devise_mailer.send(notification, self, *args).deliver
    end
  end

  def send_pending_notifications
    pending_notifications.each do |notification, args|
      devise_mailer.send(notification, self, *args).deliver
    end

    # Empty the pending notifications array because the
    # after_commit hook can be called multiple times which
    # could cause multiple emails to be sent.
    pending_notifications.clear
  end

  def pending_notifications
    @pending_notifications ||= []
  end
end

В котором вам просто нужно заменить 2 вхождения

devise_mailer.send(notification, self, *args).deliver

К

devise_mailer.delay.send(notification, self, *args)
0 голосов
/ 16 октября 2013

Это на самом деле довольно легко сделать, переопределив единственный метод в вашей пользовательской модели. Devise отправляет все электронные письма с помощью метода send_devise_notification, поэтому просто измените код, чтобы он был дружественным к асинхронности.

def send_devise_notification(notification, opts = {})
  devise_mailer.delay.send(notification, self, opts)
end

Этот код предполагает Sidekiq, хотя синтаксис может быть совместим с Resque или DelayedJob.

0 голосов
/ 23 ноября 2011

Вы пытались сделать это так:

def welcome_message
  ::Devise.mailer.delay.welcome_instructions(self)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...