使用ActiveJobs延迟邮件赢得了Rails 4.2

时间:2016-05-21 10:52:29

标签: ruby-on-rails ruby-on-rails-4 delayed-job rails-activejob

查看ActiveJob以延迟邮件程序任务(使用delayed_jobs,delayed_jobs_active_record),我有2个问题:

  • ActiveJob的ActionMailer的deliver_later方法
  • 如果作业可以有多种执行方法

我有一个Post模型,如果已更新并删除,则需要向主持人发送电子邮件。

# Post Model
class Post < ActiveRecord::Base
# Table name: posts
#
#  id         :integer
#  title      :string 
#  body       :text           
#  created_at :datetime
#  updated_at :datetime

  before_save :email_mod_post_updated, :email_mod_post_deleted

  private

    def email_mod_post_updated
      ModeratorMailerJob.updated_post_email(self).deliver_later
    end

    def email_mod_post_deleted
      ModeratorMailerJob.deleted_post_email(self).deliver_later
    end
end

# ModeratorMailer
class ModeratorMailer < ApplicationMailer
  default from: "Mod <mod@domain.com>"

  def updated_post_email(post)
    @post = post
    mail(to: "mod@domain.com", subject: "Post Updated - #{@post.title}")
  end

  def deleted_post_email(post)
    @post = post
    mail(to: "mod@domain.com", subject: "Post Deleted - #{@post.title}")
  end
end

当前ActiveJob设置:

# app/jobs/updated_post_email_job.rb
class UpdatedPostEmailJob < ActiveJob::Base
  queue_as :default

  def perform(post)
    ModeratorMailer.updated_post_email(post)
  end
end

# app/jobs/deleted_post_email_job.rb
class DeletedPostEmailJob < ActiveJob::Base
  queue_as :default

  def perform(post)
    ModeratorMailer.deleted_post_email(post)
  end
end

问题1: 使用deliver_later方法,这仍然会设置ActiveJob,例如。 app/jobs/updated_post_email_job.rb或者这不是必需的(我在后台运行delayed_job)?

这与调用ModeratorMailerJob.perform_later(post)

相同吗?

问题2: 人们是否在其活动作业中添加多个执行方法,例如:

class EmailModeratorJob < ActiveJob::Base
  queue_as :default

  def perform(post)
    ModeratorMailer.updated_post(post)
  end


  def perform(post)
    ModeratorMailer.deleted_post(post)
  end
end

或者最好是为特定任务分配工作吗?

1 个答案:

答案 0 :(得分:0)

ActiveJob和邮寄者:

  1. 使用适合您需要的适配器设置ActiveJob。
  2. 使用不同的方法定义您的邮件程序(1通过您发送的不同类型的邮件)
  3. 在邮件程序中使用deliver_later方法。它将通过配置的适配器在异步作业中发送您的邮件。
  4. 那就是全部!
  5. 你不必为每封邮件定义一份工作,这是无用的。

    回答你的问题:

    1. 上面已经回答
    2. 您不应该在同一个类中使用多个具有相同名称的方法 :每个作业都应该有一个 perform方法来完成这项工作。