【问题标题】:Couldn't find OrderInstruction in ActionMailer.deliver_later, but the object exists in the database在 ActionMailer.deliver_later 中找不到 OrderInstruction,但该对象存在于数据库中
【发布时间】:2021-03-23 19:07:56
【问题描述】:

我正在发送一些关于Order 更新通知的电子邮件。该订单有很多OrderInstructions,对于每个创建的OrderInstruction,我都会发送一封包含所有相关信息的电子邮件。

以下是我为每个订单说明发送电子邮件的方式:

UserMailer.order_updated(order_instruction.id).deliver_later

在创建order_instruction 之后调用它,在发送电子邮件之前的一些步骤。 mailer 方法检查订单指令是否存在:

def order_updated(order_instruction_id):
    order_instruction = OrderInstruction.find_by(id: order_instruction_id)
    return if order_instruction.nil?
    ...
end

我的问题是这不是发送电子邮件,因为它没有找到order_instruction,但是如果我使用一个小的延迟来调用邮件:

UserMailer.order_updated(order_instruction.id).deliver_later(wait: 5.seconds)

效果很好。

我错过了什么吗?如果我引发错误,有没有办法让 ActionMailer 在一段时间后重试?或者,让 ActionMailer 等待所有电子邮件发送的时间,这样就不必在每次出现这种情况时都解决这个问题。

【问题讨论】:

    标签: ruby-on-rails actionmailer


    【解决方案1】:

    我建议在调用 UserMailer.order_updated(order_instruction.id).deliver_later 以检查数据库中是否存在对象之前停止调试(例如使用 binding.pry)。

    也许您正在 ActiveRecord 事务中调用邮件程序,但尚未提交更改。

    【讨论】:

    • 看来是这样。除了为交易期间发送的每封电子邮件手动设置延迟之外,是否有解决方案?如果交易花费的时间超过了我设置的延迟时间怎么办?
    • 也许您可以将电子邮件生成移至回调或使用此 gem github.com/grosser/ar_after_transaction
    猜你喜欢
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2019-12-31
    相关资源
    最近更新 更多