2014-01-24 2 views
0

То, что я пытаюсь сделать, это использовать Sideqik для чтения некоторых данных из файла в фоновом режиме. Моя проблема заключается в том, что когда я передаю UploadedFile с моего контроллера на рабочего, он переходит из UploadedFile в Hash.Sidekiq UploadedFile становится Hash

В создании метода моего контроллера:

file = params[file_key]             
if not (file.nil? or file.class == ActionDispatch::Http::UploadedFile)  
    raise "File not a file in Controller!"         
elsif not file.nil?              
    ImporterWorker.perform_async(name, file)         
end 

Исключение не поднимается, и мы весело идти на ImporterWorker, который имеет:

def perform(name, file)                          
    if not file.class == ActionDispatch::Http::UploadedFile      
    raise "File is: #{ file.class }:#{ file.inspect }"    
    end 
    ... 

Когда возбуждается исключение, с «Файл is: Hash: ", за которым следует огромная цепочка произвольных вещей, которые я представляю, это представление содержимого файла, за которым следует« 'original_filename' => 'Foo.xls' и другие подобные поля.

Почему это становится хешем? Что я могу сделать, чтобы исправить это?

ответ

3

согласно sidekiq documentation:

Там три способа создания задания в коде приложения ... Все три способа создания хэша, который представляет собой работу, упорядочивает, что Hash в строку JSON и толкает эту строку в очередь в Redis. Это означает, что аргументы вашему работнику должны быть простыми типами данных JSON (числа, строки, логические, массивы, хеш). Сложные объекты Ruby (например, экземпляры Date, Time, ActiveRecord) не будут правильно сериализованы.

Так что вам нужно, чтобы сохранить файл на более постоянной основе, а затем передать путь к файлу на работу для дальнейшей обработки