如何从Rails的活动存储关联中附加邮件中的图像

时间:2018-08-17 16:04:15

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

在rails 5.2中,我有一个使用has_many_attached:images的模型。我想发送一封包含所有相关图像作为附件的电子邮件。

我的邮递员方法当前看起来像:

def discrepancy_alert(asset_discrepancy_id, options={})
  @asset_discrepancy = AssetDiscrepancy.find asset_discrepancy_id
  @asset_discrepancy.images.each_with_index do |img,i|
    attachments["img_#{ i }"] = File.read(img)
  end
  mail to: 'noone@gmail.com', subject: "email subject"
end

很显然,File.read在这里不起作用,因为img不是路径,而是blob。我无法在文档中找到关于此的任何信息

问题一:

是否有用于附加这样的blob的rails方法?

我可以改用以下内容:

@asset_discrepancy.images.each_with_index do |img,i|
  attachments["img_#{ i }"] = img.blob.download
end

问题二:

下载方法可能使用RAM日志,是否建议这种用法?

似乎,通过添加ActiveStorage,rails邮件发送者将具有一些新的方法来在两者之间进行交互。...我在文档中没有看到任何内容。所有邮件附件[]示例都使用本地文件的路径。

3 个答案:

答案 0 :(得分:1)

在mailer.rb中:

  @filename = object.image.attached? ? object.id.to_s + object.filename.extension_with_delimiter : nil
  if ActiveStorage::Blob.service.respond_to?(:path_for)
    attachments.inline[@filename] = File.read(ActiveStorage::Blob.service.send(:path_for, object.image.key))
  elsif ActiveStorage::Blob.service.respond_to?(:download)
    attachments.inline[@filename] = object.image.download
  end

在邮件视图中:

if @filename
  image_tag(attachments[@filename].url)
else
  image_tag(attachments['placeholder.png'].url)
end

答案 1 :(得分:0)

这在使用Amazon S3的生产环境中为我工作。

在邮件视图中:

if @object.images
  @object.images.each do |image|
    path = "https://www.example.com" + Rails.application.routes.url_helpers.rails_blob_path(image, only_path: true)
    <img src="<%=path%>">
  end
end

答案 2 :(得分:0)

这是电子邮件模板中活动存储URL的有效解决方案。我已经看到了在gmail中可见的图像。您可以使用“ rails_blob_url”。这适用于存储在aws s3中的文件。

mailer.rb

....    
@image_url = Rails.application.routes.url_helpers.rails_blob_url(blob),
....

邮件查看器文件

<img src="<%= @image_url %>">