如何附加新创建的 .xlsx 文件进行记录?

How to attach newly created .xlsx file to record?

class MyLog < ApplicationRecord
  has_one_attached :xlsx_file
end

我创建 .xlsx 文件作为电子邮件附件:

xlsx = render_to_string layout: false, template: "dir/template"
xlsx_base64 = Base64.encode64(xlsx)
attachment = {mime_type: Mime[:xlsx], content: xlsx_base64, encoding: 'base64'}
attachments["file.xlsx"] = attachment

我还想将此文件添加到 MyLog table 作为附件:

MyLog.create(
  xlsx_file: xlsx
)

但是 xlsx 是一个字符串,它不起作用。在通常的示例中,可附加文件来自带有 ActionDispatch::Http::UploadedFile class 的 file_field 标签,并且它正在运行。如何将新创建的 with calsx .xlsx 文件附加到我的记录中?

无需使用上传文件即可完成此操作的方法是 .attach 函数 (docs)。

示例:

xlsx = render_to_string layout: false, template: "dir/template"
log = MyLog.create
log.xlsx_file.attach(io: StringIO.new(xlsx), filename: 'file.xlsx', content_type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')

如果您正在从文件系统读取数据,您也可以将 StringIO.new(string_content) 替换为 File.open(filename)