Rails + Devise + delayed_job? - PullRequest
       14

Rails + Devise + delayed_job?

19 голосов
/ 08 ноября 2010

У меня есть приложение Rails 3, использующее Devise на Heroku. Проблема в том, что я отправляю электронные письма с помощью Sendgrid, и доставка почты идет медленно, приложение зависает. Поэтому я заинтересован в использовании delayed_job для постановки в очередь доставки электронной почты в фоновом режиме, чтобы мое приложение реагировало на пользователя.

Как Devise можно использовать с delayed_job? Любой способ настроить Devise для использования delayed_job?

Ответы [ 9 ]

24 голосов
/ 11 февраля 2011

От Роберта Мея: https://gist.github.com/659514

Добавьте это в файл в каталоге config/initializers:

module Devise
  module Models
    module Confirmable
      handle_asynchronously :send_confirmation_instructions
    end

    module Recoverable
      handle_asynchronously :send_reset_password_instructions
    end

    module Lockable
      handle_asynchronously :send_unlock_instructions
    end
  end
end
12 голосов
/ 05 сентября 2012

Согласно вики-странице Devise , гем devise-async поможет вам. Он поддерживает delayed_job, resque и sidekiq.

6 голосов
/ 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
3 голосов
/ 16 мая 2012

это то, что сработало для меня:

в app / models / user.rb

  # after your devise declarations
  handle_asynchronously :send_reset_password_instructions
  handle_asynchronously :send_confirmation_instructions
  handle_asynchronously :send_on_create_confirmation_instructions

вам может не понадобиться все из них, в зависимости от того, какие модули разработки вы используете

1 голос
/ 27 декабря 2010

Я не уверен, что Devise предоставляет простой способ справиться с доставкой электронной почты. Однако есть способы сделать это с DelayedJoy. DelyedJob предоставляет функцию «handle_asynchronously», которая при внедрении в DeviseMailer может гарантировать, что доставка происходит в фоновом режиме.

Попробуйте это в вашем config / application.rb

config.after_initialize do 
  ::DeviseMailer.handle_asynchronously :deliver_confirmation_instructions 
  # or
  ::DeviseMailer.handle_asynchronously :deliver!
end

Вам нужно будет поэкспериментировать с этим. Вы также можете попытаться унаследовать DeviseMailer и настроить его на асинхронную доставку в инициализаторе в config / initializer / devise_mailer_setup.rb или что-то в этом роде.

0 голосов
/ 25 июля 2016

Для delayed_job_active_record с Devise , просто используйте следующее.(добавьте его к user.rb model)

handle_asynchronously :send_devise_notification, :queue => 'devise'
0 голосов
/ 05 января 2011

Я использую плагин delayed_job_mailer для выполнения этого в приложениях Rails 2.Не уверен, работает ли он с Rails 3.

0 голосов
/ 30 декабря 2010

Я обычно считаю, что лучше всего избегать любых и всех диспетчеров фоновых задач, доступных для Ruby и Rails, точка.Они сосут

Вместо этого я использую crontab - древнюю программу, которая отлично справляется со своей работой.Просто сделайте скрипт, который будет выполнять вашу грязную работу очень часто, и скажите crontab, чтобы он запускался в нужное время с помощью rails runner.Это сохраняет эти надоедливые длительные задачи вне времени выполнения остальной части вашего приложения Rails, но у вас все еще есть доступ к базе данных и всему стеку Rails, если вы хотите / нуждаетесь в этом.

0 голосов
/ 27 декабря 2010

Не знаю, зачем вам нужно аутентифицировать любую из задач delayed_job.Просто поместите действия контроллера аутентифицированного Devise в очередь доставки электронной почты в библиотечный метод.

...