【问题标题】:Delaying Mail with ActiveJobs won Rails 4.2使用 ActiveJobs 延迟邮件赢得 Rails 4.2
【发布时间】:2016-05-21 10:52:28
【问题描述】:

查看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

还是最好为特定任务分配不同的工作?

【问题讨论】:

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


    【解决方案1】:

    ActiveJob 和邮件程序:

    1. 使用适合您需要的适配器设置 ActiveJob。
    2. 使用不同的方法定义您的邮件程序(1 通过您发送的不同类型的邮件)
    3. 在邮件中使用deliver_later 方法。它将通过配置的适配器以异步作业的形式发送您的邮件。
    4. 就是这样!

    您不必为每封邮件定义 1 个工作,这没用。

    回答你的问题:

    1. 上面已经回答了
    2. 在同一个类中不应有多个同名方法 :每个工作都应该有一个 perform 方法来完成这项工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多