临时文件停止存在于块外部的实例变量中

时间:2019-03-16 11:43:12

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

我有这种方法,旨在将文件从活动存储复制到实例变量上存储的临时文件

def initialize(activity)
    ActiveStorage::Downloader
        .new(activity.original_activity_log_file)
        .download_blob_to_tempfile do |tempfile|
            @activity_file_temp = tempfile
            ap @activity_file_temp.path
        end

    ap @activity_file_temp.path
end

运行此代码时,我看到输出

"/tmp/ActiveStorage-32-20190316-23089-fdwpa5.fit"
nil

为什么文件在第二张照片上不再存在?感觉像是一个范围问题,但我不认为实例变量应该受到这种影响。

2 个答案:

答案 0 :(得分:0)

def initialize(activity)
  @activity_file_temp = Tempfile.new
  begin 
    ActiveStorage::Downloader
      .new(activity.original_activity_log_file)
      .download_blob_to(@activity_file_temp)
  ensure
    @activity_file_temp.close
  end
end

Tempfile#close在对象完成之前不会取消链接文件。

答案 1 :(得分:0)

我通过使用download_blob_to方法解决了这个问题,该方法将保存到您提供的临时文件中,而不是返回一个临时文件。