我正在运行Q& A服务。管理员可以做的事情之一是将问题标记为offtopic。当他们这样做时,会向发送问题的人发送电子邮件,告诉他们他们的电子邮件是非正式的。
电子邮件通知是通过delayed_job发送的:
QuestionMailer.delay.notify_asker_of_offtopic_flag question
然而,有时候有人可能会意外地将问题标记为offtopic或改变主意。为了避免向最初询问它的人发出不正确的通知,我想创建一个短暂的延迟,并在邮件请求运行时评估问题是否仍然是offtopic:
延迟拨打邮件:
QuestionMailer.delay(run_at: Time.now + 3.minutes).notify_asker_of_offtopic_flag(question)
邮件程序:
class QuestionMailer
...
def notify_asker_of_offtopic_flag question
if question.offtopic?
# do mailing
end
end
end
不幸的是,这不是那么简单,因为if
块只会导致错误,然后导致delayed_job一次又一次地重试作业。
我现在正在尝试一些非常迂回的方法来实现相同目的,但我真的想找到一些方法来中止QuestionMailer
操作而不会触发错误。这可能吗?
答案 0 :(得分:2)
不要拖延邮件。或许延迟你的Question类中的另一个类方法?传递问题的ID并在该延迟方法中检查问题是否仍然是offtopic,如果是,则同步发送电子邮件。
基本上,您的notify_asker_of_offtopic_flag可以移动到您的问题模型,然后邮件是同步的(我确定您将重命名您的方法)。
通过在您的邮件操作本身的核心中将perform_deliveries设置为false来进行关于防止传递的讨论,但我不是100%在哪里或如何最终结束。