我正在使用ruby gem进行gpx解析和编辑。我想将编辑后的结果存储在活动存储中。
宝石具有这种保存方法
def write(filename, update_time = true)
@time = Time.now if @time.nil? || update_time
@name ||= File.basename(filename)
doc = generate_xml_doc
File.open(filename, 'w+') { |f| f.write(doc.to_xml) }
end
ActiveStorage有一个保存示例
@message.image.attach(io: File.open('/path/to/file'), filename: 'file.pdf')
我可以同时使用这两种方法,但是它们应该都可以工作,但是我写了两次文件,并且在文件系统上有一个多余的文件,需要稍后手动删除。
理想的情况是让gpx gem直接将数据传递到ActiveStorage,并让AS作为唯一保存文件的人。
给定write()
似乎是导出/保存数据的唯一方法,而generate_xml_doc
是私有方法,有什么方法可以实现而无需分叉gem或猴子修补它? / p>
答案 0 :(得分:1)
看着gem documentation,看起来好像不需要使用write
方法,而是使用to_s
方法,该方法应该创建xml字符串,然后可以使用Tempfile来使用活动存储上传:
这是to_s
方法
def to_s(update_time = true)
@time = Time.now if @time.nil? || update_time
doc = generate_xml_doc
doc.to_xml
end
#so assuming you have something like this:
bounds = GPX::Bounds.new(params)
file = Tempfile.new('foo')
file.path # => A unique filename in the OS's temp directory,
# e.g.: "/tmp/foo.24722.0"
# This filename contains 'foo' in its basename.
file.write bounds.to_s
file.rewind
@message.image.attach(io: file.read, filename: 'some_s3_file_name.xml')
file.close
file.unlink # deletes the temp file
已更新(感谢@Matthew):
但是您甚至可能不需要临时文件,这可能会起作用
bounds = GPX::Bounds.new(params)
@message.image.attach(io: StringIO.new(bounds.to_s), name: 'some_s3_file_name.xml')