如何中止交付ActionMailer请求?
我正在运行Q &服务。管理员可以做的一件事就是将问题标记为偏离主题。当他们这样做时,一封电子邮件就会发送给提问他们的人,他们的电子邮件是不正确的。如何中止交付ActionMailer请求?
电子邮件通知经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
块只是导致错误WHI ch然后导致delayed_job一次又一次地重试该作业。
我现在正在试验一些漂亮的迂回方法来达到同样的目的,但我真的很想找到一些方法来中止QuestionMailer
操作而不会触发错误。这可能吗?
@Aditya的答案基本上是正确的,但是我想保留我的方法在Mailer对象上以保持事情的美观和整洁。这需要一些额外的黑客。
创建可与尝试取消一个实例梅勒方法来延迟
问题邮包一个新的类方法是,它本质上触发渲染和其他的东西,阻止被中止的方法。不过,我仍然想把所有的梅勒逻辑放在一起。
我这样做的方式是使用类方法而不是实例方法。这避免了所有上ActionMailer
实例调用方法时,在踢挂钩的,但仍然让我保持代码的整洁,一起
class QuestionMailer
...
def notify_asker_of_offtopic_flag question
...
end
def self.notify_asker_of_offtopic_flag question_if question
if question.offtopic?
QuestionMailer.notify_asker_of_offtopic_flag question
end
end
end
NB修复使用延迟工作
这个工程除了对于需要处理delayed_job
的一个轻微攻击。
在处理邮件程序时,delayed_job将始终在返回的对象上调用.deliver
以传递邮件。当我们返回一个邮件对象时这很好,但在这种情况下,我们返回nil。因此,delayed_job
尝试拨打.deliver
nil
,一切都失败。
为了说明这一点,我们简单地返回包含欺骗.deliver
方法的虚拟邮件对象:
class QuestionMailer
...
class DummyMailer
def deliver
return true
end
end
def notify_asker_of_offtopic_flag question
# do mailing stuff
end
def self.notify_asker_of_offtopic_flag question_if question
if question.offtopic?
QuestionMailer.notify_asker_of_offtopic_flag question
else
DummyMailer.new
end
end
end
不要延迟邮件。可能会延迟Question类中的另一个类方法?传递问题的ID并在延迟的方法中检查问题是否仍然存在问题,如果是,则同步发送电子邮件。
本质上,您的notify_asker_of_offtopic_flag可以移动到您的问题模型,然后邮件是同步的(我相信您会重命名您的方法)。
有关于通过在您的邮件操作本身的内核中将perform_deliveries设置为false来防止交付的讨论,但我不是100%在哪里或如何最终结束。
谢谢你提供的,非常有帮助。这是我正在考虑去的地方,但不确定是否有更清晰的方式 – 2012-07-27 10:02:51