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

Rails + Devise + delayed_job?

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

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

4b9b3361

Ответ 1

От Роберта Май: 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

Ответ 2

В соответствии с Devile wiki page devise-async gem справится с этим для вас. Он поддерживает функции delayed_job, resque и sidekiq.

Ответ 3

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

Способ разработки на самом деле говорит о том, чтобы делать что-то подобное в комментариях в коде, чтобы переопределить методы в классе 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

Ответ 4

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

в приложении /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

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

Ответ 5

Я не уверен, что 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 или что-то в этом роде.

Ответ 6

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

Ответ 7

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

Ответ 8

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

handle_asynchronously :send_devise_notification, :queue => 'devise'

Ответ 9

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

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