在我的Product#create
方法中,我有类似的东西
ProductNotificationMailer.notify_product(n.email).deliver
如果产品被保存,则会触发。现在事情是在上述被触发之前,有一堆逻辑和计算发生,这会延迟确认页面的加载时间。有没有办法确保下一页首先加载并且邮件传递可以稍后或在后台进行?
谢谢
在我的Product#create
方法中,我有类似的东西
ProductNotificationMailer.notify_product(n.email).deliver
如果产品被保存,则会触发。现在事情是在上述被触发之前,有一堆逻辑和计算发生,这会延迟确认页面的加载时间。有没有办法确保下一页首先加载并且邮件传递可以稍后或在后台进行?
谢谢
是的,您需要调查后台工作人员。Sidekiq、DelayedJob或Resque是一些流行的。
这是一个很棒的RailsCast 演示 Sidekiq。
class NotificationWorker
include Sidekiq::Worker
def perform(n_id)
n = N.find(n_id)
ProductNotificationMailer.notify_product(n.email).deliver
end
end
我不确定n
你的例子是什么,所以我就照做了。现在,您在哪里工作,您可以将其替换为:
NotificationWorker.perform_async(n.id)
您不将完整对象n
作为参数传递的原因是因为参数将被序列化,并且仅序列化整数 id 更容易/更快。
存储作业后,您将在后台运行第二个进程来完成工作,从而释放您的 Web 进程以立即返回呈现响应。