Rails + Devise + delayed_job?

我有一个使用Heroku上的Devise的Rails 3应用程序。 问题是我正在使用Sendgrid发送电子邮件,而且电子邮件递送速度很慢,这会让应用程序挂起。 所以我有兴趣使用delayed_job在后台排队电子邮件,因此我的应用程序响应用户。

Devise如何与delayed_job一起使用? 设置Devise以使用delayed_job的任何方法?

来自Robert May: 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 

根据Devise wiki页面 , devise-async gem将为您处理此问题。 它支持delayed_job,resque和sidekiq。

我发现以上都不适合我。 我正在使用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 

这对我有用:

在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 

您可能不需要所有这些,具体取决于您所包含的设计模块

我不确定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 

你需要尝试一下。 您还可以尝试inheritanceDeviseMailer并将其设置为在config / initializer / devise_mailer_setup.rb中的初始化程序中异步传递或其他类似的操作。

我使用delayed_job_mailer插件在Rails 2应用程序中完成此操作。 不确定它是否适用于Rails 3。

不确定为什么需要validation任何delayed_job任务。 只需让Devise认证的控制器操作将电子邮件传递排队到库方法。

对于使用Devise的 delayed_job_active_record ,只需使用以下内容即可。 (将其添加到user.rb model

 handle_asynchronously :send_devise_notification, :queue => 'devise' 

我一般认为最好避免任何和所有后台作业任务管理器可用于Ruby和Rails期间。 他们很糟糕。

相反,我使用crontab,这是一个古老的程序,非常擅长它的工作。 只需制作一个脚本来经常进行脏工作,并告诉crontab使用rails runner在正确的时间运行它。 这使得那些讨厌的长时间运行的任务超出了Rails应用程序其余部分的运行时间,但是如果你想要/需要它,你仍然可以访问数据库和整个Rails堆栈。