【问题标题】:Attach active storage file to mailer将活动存储文件附加到邮件程序
【发布时间】:2019-05-28 04:11:07
【问题描述】:

我已经尝试了所有方法,但仍然无法正常工作。

我的系统中有两种类型的应用程序经过资格预审并发送给贷方,

1) 生成一个 pdf 2) 第二个应该使用活动存储附件并将它们附加到 ActionMailer

第一个工作正常,第二个给我以下错误:

[ActionMailer::DeliveryJob] [905177a5-b0e9-46f4-ba9a-fc4630e873f9] 执行 ActionMailer::DeliveryJob 时出错(作业 ID: 905177a5-b0e9-46f4-ba9a-fc4630e873f9) 在 140.14 毫秒内来自异步(邮件): Errno::ENOENT(没有这样的文件或目录 @ rb_sysopen - https://funderhunt.co/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBZ1lIIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--fa91a15681c23d47d767169c7821601aa15ed2b3/Statuses.pages?disposition=attachment):

链接正确:

这部分的邮件代码如下所示:

      q = 0
      statement.files.each do |file|
        q += 1
        bank_statement = File.read(rails_blob_url(file, disposition: "attachment"))
        attachments["statement_#{q}.pdf"] = { :mime_type => 'application/pdf', :content => bank_statement }
      end

怎么了?你能帮忙吗?提前致谢。

【问题讨论】:

  • File.read 需要一个本地文件,而不是 URL。

标签: ruby-on-rails ruby actionmailer rails-activestorage


【解决方案1】:

如果有人在这里寻找通用解决方案:

modelname.attachments.each do |file|
  attachments[file.blob.filename.to_s] = {
    mime_type: file.blob.content_type,
    content: file.blob.download
  }
end

【讨论】:

    【解决方案2】:

    你应该能够做类似的事情,

    statement.files.each_with_index do |file, q|
      attachments["statement_#{q + 1}.pdf"] = { mime_type: 'application/pdf', content: file.blob.download }
    end
    

    file.blob.download会返回文件的内容,类似于File.read

    【讨论】:

    • 嗨,谢谢,是的,我之前也做过同样的事情,但是,它如何影响记忆?系统会将该文件存储在缓存中还是 tmp 中?之后如何删除它们?
    • Blob#download 被读入内存,然后由 Ruby 的 GC 收集。如果您将一个块传递给Blob#download,它将以块的形式流式传输和生成。
    猜你喜欢
    • 2011-12-18
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 2014-06-25
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多