情况
我有一个模型
invoice
,其属性 frozenn
可以在我的应用程序中处理 archiving
。在 archiving
上,应该生成并附加 PDF(我的应用程序中名为 out_invoice
[invoice
的子模型])的出库发票,其中包含以下 callback
:
def store_physical_copy_on_freeze!
unless physical_copy.attached? # without attachment attach current pdf permanently
pdf_str = Home::OutInvoicesController.render(
template: "home/out_invoices/pdf",
layout: 'pdf',
assigns: {
out_invoice: self,
bank_account: company.mean_of_payment_for_invoices
}
)
pdf = WickedPdf.new.pdf_from_string(pdf_str)
# attach the currently live generated out invoice forever
physical_copy.attach(io: StringIO.new(pdf), filename: "#{pdf_name}.pdf")
end
end
问题:
方法调用完成后,附加的 PDF 不再附加(在控制台上检查,因为它没有出现在应该出现的前端中)。
我使用
byebug
进行调试,结果如下:在 .attach
调用之后,physical_copy.attached?
是 true
,因此人们必须假设它有效,但事实并非如此。
这不是新代码,而是以前一直在工作的旧代码,据我所知,我没有更改相关配置。但这可能就是原因。
一位朋友(Rails 专家)帮助我解决了这个问题。此方法调用是在
after_save
回调中触发的。模型的回调似乎再次重新触发了回调链或其他东西(老实说,没有完全理解这个问题)。他将回调从 after_save
更改为 before_save
解决了上述问题。我也不会通过查看旧代码来猜测,但解决方案的想法是正确的。看看历史的变迁。对@dbugger 的评论投了赞成票!