Rails + Devise + delayed_job?
У меня есть приложение Rails 3 с помощью Devise on Heroku. Проблема в том, что я отправляю электронные письма с помощью Sendgrid, а доставка по электронной почте идет медленно, это заставляет приложение зависать. Поэтому я заинтересован в том, чтобы использовать delayed_job для очереди доставки электронной почты в фоновом режиме, чтобы мое приложение реагировало на пользователя.
Как можно использовать Devise с задержкой_job? Любой способ настроить Devise для использования delayed_job?
Ответы
Ответ 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, если вы хотите/нуждаетесь в ней.