在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邮件发送者将具有一些新的方法来在两者之间进行交互。...我在文档中没有看到任何内容。所有邮件附件[]示例都使用本地文件的路径。
答案 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 %>">