Tempfile перестает существовать в переменной экземпляра за пределами блока - PullRequest
0 голосов
/ 16 марта 2019

У меня есть этот метод, который предназначен для копирования файла из активного хранилища в временный файл, хранящийся в переменной экземпляра

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 голосов
/ 23 марта 2019

Я решил эту проблему, используя вместо этого метод download_blob_to, который сохраняет предоставленный вами временный файл, а не возвращает его.

0 голосов
/ 16 марта 2019
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 не отменяет связь с файлом, пока объект не будет завершен.

...