Ale*_*der 3 actionmailer delayed-job ruby-on-rails-4.2 rails-activejob
我使用延迟作业作为Active Job的排队后端.我没有设置任何自定义作业,并计划使用Action Mailer 异步发送预定的电子邮件.如何防止计划的电子邮件被发送出去?
例如,假设用户可以在我的应用程序上设置电子邮件提醒.如果用户将来设置三天的提醒,则将创建一个作业.如果用户删除了该电子邮件提醒,则应删除该作业.
任何帮助将不胜感激!
我决定以不同的方式解决问题.我只是简单地安排工作,而不是安排工作并销毁它.
当用户将来设置三天的提醒时,就像以前一样创建一个作业.如果用户删除了电子邮件提醒,则该作业仍将在三天内运行,但不会执行任何操作.这是一个示例设置:
# controllers/users_controller.rb
def schedule_reminder
# Get the user that scheduled the reminder
user = User.find_by_id(params[:id])
# Create a reminder for the user
reminder = user.reminders.create(active: true)
# Schedule the reminder to be sent out
SendReminderJob.set(wait_until: 3.days.from_now).perform_later(reminder.id)
end
def unschedule_reminder
reminder = Reminder.find_by_id(params[:reminder_id])
reminder.destroy
end
Run Code Online (Sandbox Code Playgroud)
当用户安排提醒时,def schedule_reminder执行.此方法会创建提醒并安排将在3天内运行的作业.它将提醒的ID作为参数传递,以便作业可以在运行时检索提醒.
当用户删除提醒时,def unschedule_reminder执行.此方法查找提醒并删除它.
这就是我的SendReminderJob工作:
# jobs/send_reminder_job.rb
class SendReminderJob < ActiveJob::Base
queue_as :default
def perform(*args)
# Get the reminder
# args.first is the reminder ID
reminder = Reminder.find_by_id(args.first)
# Check if the reminder exists
if !reminder.nil?
# Send the email to the user
end
end
end
Run Code Online (Sandbox Code Playgroud)
当此作业在三天内运行时,它会检查提醒是否仍然设置.如果是,它会向用户发送一封电子邮件.否则,它什么都不做.无论它是否做任何事情,这项工作将在三天后删除!
| 归档时间: |
|
| 查看次数: |
1993 次 |
| 最近记录: |