代码之家  ›  专栏  ›  技术社区  ›  Qwertie

是否可以直接将此文件保存到ActiveStorage?

  •  0
  • Qwertie  · 技术社区  · 7 年前

    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 
    

    @message.image.attach(io: File.open('/path/to/file'), filename: 'file.pdf')
    

    我可以同时使用这两个文件,而且应该可以工作,但是我编写了两次该文件,同时在文件系统上还有一个多余的不需要的文件,以后需要手动删除。

    理想的情况是让gpxgem直接将数据传递到ActiveStorage,并让AS作为唯一一个保存文件的人。

    鉴于 write() 似乎是导出/保存数据和 generate_xml_doc 是一个私人的方法,有没有什么办法我可以做到这一点,而不分叉宝石或猴子修补呢?

    1 回复  |  直到 7 年前
        1
  •  2
  •   lacostenycoder    7 年前

    在看 gem documentation ,看起来你不需要使用 write 方法,但使用 to_s 方法,该方法应创建xml字符串,然后您可以使用Tempfile将其与活动存储一起上载:

    这是你的答案 到\u 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
    

    bounds = GPX::Bounds.new(params)
    @message.image.attach(io: StringIO.new(bounds.to_s),  name: 'some_s3_file_name.xml') 
    
    推荐文章