Rails — ActionDispatch::Http::UploadedFile в фоновом задании

Я использую ту же идею, что и в импорте csv и excel Railscast но поскольку стандартный код в этом эпизоде ​​требует некоторого времени для обработки (использует ActiveRecord для создания новой записи для каждой строки в файле), я получаю тайм-ауты на Heroku и хотел бы перенести процесс импорта в фоновое задание.

Мне не удалось отправить файловую переменную (которая имеет тип ActionDispatch::Http::UploadedFile) в задание, поэтому вместо этого я отправил отдельные переменные file.original_filename и file.path

Задание завершается с ошибкой file /var/folders/q3/xn0bp7yd2m56_4lbq0069jj80000gn/T/RackMultipart20150319-72431-1a4pnja.xlsx does not exist, которая, как я предполагаю, происходит из-за того, что файл уже был удален до начала задания:

Загруженные файлы являются временными файлами, срок жизни которых составляет один запрос. Когда объект завершен, Ruby отменяет связь с файлом, поэтому нет необходимости очищать их с помощью отдельной задачи обслуживания.

ActionDispatch::Http::UploadedFile

Может ли файл, загруженный с помощью ActionDispatch::Http::UploadedFile, не использоваться в фоновых заданиях?

Я использую Rails 4.2, ActiveJob и Resque.


person Marklar    schedule 19.03.2015    source источник


Ответы (1)


Нет, загруженный файл нельзя использовать в фоновом задании. Что вам нужно сделать, так это сохранить загруженный файл в более постоянное место для обработки фоновым заданием.

Вашему контроллеру потребуется что-то вроде:

file_path_to_save_to = '/path/to/file'
File.write(file_path_to_save_to, params[:uploaded_file].read)
BackgroundJob.perform_later file_path_to_save_to
person Rob Di Marco    schedule 19.03.2015
comment
Спасибо за помощь. Итак, поскольку я нахожусь на Heroku, я должен использовать место сохранения, такое как AWS S3? - person Marklar; 19.03.2015