我在Heroku上使用Devise有一个Rails 3应用程序。问题是我正在发送带有Sendgrid的电子邮件,而且电子邮件递送速度很慢,这会让应用程序挂起。所以我有兴趣使用delayed_job在后台排队电子邮件,因此我的应用程序响应用户。
Devise如何与delayed_job一起使用?设置Devise以使用delayed_job的任何方法?
答案 0 :(得分:24)
来自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
答案 1 :(得分:12)
根据Devise wiki page,devise-async gem将为您处理此问题。它支持delayed_job,resque和sidekiq。
答案 2 :(得分:6)
我发现以上都不适合我。我正在使用Devise 2.0.4和Rails 3.2.2 with 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
答案 3 :(得分:3)
这对我有用:
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
根据您所使用的设计模块
,您可能不需要所有这些模块答案 4 :(得分:1)
我不确定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中的初始化程序中异步传递,或者为此产生影响。
答案 5 :(得分:0)
不确定为什么需要验证任何delayed_job任务。只需让Devise认证的控制器操作将电子邮件传递排队到库方法。
答案 6 :(得分:0)
我使用delayed_job_mailer插件在Rails 2应用程序中完成此操作。不确定它是否适用于Rails 3。
答案 7 :(得分:0)
对于设计的delayed_job_active_record,只需使用以下内容即可。 (将其添加到user.rb model
)
handle_asynchronously :send_devise_notification, :queue => 'devise'
答案 8 :(得分:-4)
我一般认为最好避免任何和所有后台作业任务管理器可用于Ruby和Rails期间。他们很糟糕。
相反,我使用crontab,这是一个古老的程序,非常擅长于它的工作。只需制作一个脚本来经常进行脏工作,并告诉crontab使用rails runner在正确的时间运行它。这使得那些讨厌的长时间运行任务超出了Rails应用程序其余部分的运行时间,但是如果你想要/需要它,你仍然可以访问数据库和整个Rails堆栈。