Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 结合主动工作和行动邮件的最佳方法?_Ruby On Rails_Actionmailer_Rails Activejob - Fatal编程技术网

Ruby on rails 结合主动工作和行动邮件的最佳方法?

Ruby on rails 结合主动工作和行动邮件的最佳方法?,ruby-on-rails,actionmailer,rails-activejob,Ruby On Rails,Actionmailer,Rails Activejob,使用Rails Action Mailer时,您可以选择使用deliver\u now立即发送电子邮件,或deliver\u later使用Active Job异步发送。如果活动作业未指定适配器,则它将使用进程内线程池,如果服务器停止,该线程池将不会持久化。或者,我可以创建一个作业来管理我的电子邮件,然后我可以使用perform\u now或perform\u later调用它,据我所知,这与deliver\u now和deliver\u later大致相同 我的问题是,如果我指定一个适配器,比

使用Rails Action Mailer时,您可以选择使用
deliver\u now
立即发送电子邮件,或
deliver\u later
使用Active Job异步发送。如果活动作业未指定适配器,则它将使用进程内线程池,如果服务器停止,该线程池将不会持久化。或者,我可以创建一个作业来管理我的电子邮件,然后我可以使用
perform\u now
perform\u later
调用它,据我所知,这与
deliver\u now
deliver\u later
大致相同

我的问题是,如果我指定一个适配器,比如说Sidekiq,然后有一个数据库来存储我的作业,为什么我要创建一个作业来处理我的电子邮件?是否有任何额外的好处,或这是一个不必要的步骤?另一方面,如果我真的想为流程创建一个作业,那么我的电子邮件方法是否需要现在就交付,或者干脆什么都不发送?我猜想,如果电子邮件上写着“以后发送”,它会不会将电子邮件击退到队列的末尾,并迫使它再次等待,直到它被发送?
举例来说,如果我没有处理电子邮件的工作,我只需要:

class UserMailer < ActionMailer::Base
  def send_email(user)
    mail(to: user.email, subject: "My Subject")
  end
end

最后,我认为这没有意义,但如果我使用:

def perform(user)
  UserMailer.send_email(user).deliver_later
end

我使用Sidekiq进行异步作业。使用Sidekiq可以创建称为workers的特殊块。你可以现在打电话给工人,或者晚一点打电话,或者晚一点打电话给工人,在x分钟或小时内打电话。如果稍后交付,则作业(工作人员)将被放置在队列中,并在处理队列中前面的每个项目时进行处理。在一个工人身上,我“现在”投递邮件。我不知道Sidekiq以外的活跃工作是如何工作的。我以后只给员工发邮件,不发邮件。这个帖子可能会消除你的疑虑:我建议你只在现在发送电子邮件,如果以后需要发送电子邮件,就把它放在工作中。你在那里问了几个不同的问题和各种后续问题。我认为如果你坚持一个明确的问题,你就更有可能得到更好的答案。
def perform(user)
  UserMailer.send_email(user)
end
def perform(user)
  UserMailer.send_email(user).deliver_later
end