ActiveStorage :: FileNotFoundError (ActiveStorage :: FileNotFoundError) в журнале сервера, но не воспроизводится в консоли - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть следующая модель:

class Section < ApplicationRecord
  has_many_attached :files
  def to_dir
    [client.to_dir, operation.to_dir, self.name.parameterize].join('/')
  end
  after_save :transload_files

  def transload_files
    TransloadService.sync( self.to_dir, self.files )
  end
end

Метод transload_files является проблемой. Вот служба перегрузки:

class TransloadService

    class << self

        def sync(check_dir, files)
            # First we have to check the transload dir for files that have been deleted on the app
            transloaded_files = Request.list(check_dir)
            cull_list = transloaded_files.reject{ |e| files.map{|t| t.filename }.include? Request.filename(e)}
            if cull_list.count > 0
                Request.trim(cull_list)
                p "#{cull_list.count} files trimed from #{check_dir}."
            end

            # Next we have to upload files which arent present in the transload dir

            send_list = files.reject{ |e| transloaded_files.map{|t| Request.filename(t) }.include? e.filename.to_s }
            if send_list.count > 0
                Request.upload_to(check_dir, send_list)
                p "#{send_list.map{|r| r.filename.to_s}.join(', ')} uploaded to #{check_dir}"
            end
        end

    end

end

, а вот соответствующий код в request.rb

class Request
    class << self
        def upload_to(destination, files)
            files.each do |file|
                send_to = connection.object("#{destination}/#{file.filename}")
                file.open{ |tmp| send_to.upload_file(tmp) }
            end
        end
    end
end

Проблема, с которой я сталкиваюсь, заключается в следующем: Когда выполняется обратный вызов after_save метод transload_files возвращает ActiveStorage::FileNotFoundError (ActiveStorage::FileNotFoundError)

Когда я запускаю Section.last.transload_files в консоли, он работает точно так, как задумано. Что мне здесь не хватает?

1 Ответ

0 голосов
/ 29 апреля 2020

После экспериментов в течение примерно двух дней я просто пришел к выводу, что, хотя запись ActiveStorage создана, она будет недоступна при любых обратных вызовах модели. Официальная документация AS ссылается на after-create-commit callback здесь , однако мне не удалось позвонить blob.open или blob.download, как во включенном примере. Однако из консоли это работает.

Мне удалось решить эту проблему, вызвав задание из модели Section, а затем вызвав службу перегрузки из задания.

...