SmarterCSV и resque приводит к закрытию неопределенного метода

Я пытаюсь использовать Resque и SmarterCSV, но постоянно вижу ту же ошибку:

undefined method 'close' for nil:NilClass

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

Моя форма:

<%= form_tag check_upload_file_path, multipart: true do %>
    <%= file_field_tag :file %>
    <%= select_tag 'location', options_from_collection_for_select(Location.real, 'id', 'name'), include_blank: true %>
    <br>
    <%= submit_tag "Preview", class: "btn btn-awaken btn-sm approve-me", name: 'preview' %>
<% end %>

Мой контроллер:

def check_upload_file
    Resque.enqueue(AddClientsFromScale, params[:file], params[:location])
    redirect_to bulk_uploads_path
end

Мой работник:

class AddClientsFromScale
    @queue = :validate_file

    puts "adding clients from scale..."

    def self.perform(file, location_id)
        p file, location_id
        WeighIn.check_file(file, location_id)
    end
end

Моя модель:

class WeighIn < ActiveRecord::Base
    @hash_for_new_clients = {
        ' ID'                           => 'scale_id',
        'Full Name'                     => 'name',
    }

    def self.check_file(file, location_id)
        options = {:key_mapping => @hash_for_new_clients, :strings_as_keys => true, :keep_original_headers => true, :remove_unmapped_keys => true}

        # prints the file and contents properly
        p "file: ", file["tempfile"] 

        SmarterCSV.process(file, options) do |row|
            p row
        end
    end
end

Кто-нибудь знает, что происходит?

1 ответ

Проблема в том, что file Переменная - это хеш, содержащий больше данных, чем просто сам файл. Подсказка - то, где вы печатаете это, используя file["tempfile"], Это то, что вам нужно подключить к SmarterCSV, потому что это то, что ссылается на фактический файл, который вы пытаетесь обработать.

SmarterCSV.process(file["tempfile"], options) do |row|

В моем случае у меня была дополнительная проблема с кодировкой файлов, когда я получил эту ошибку от SmarterCSV:

ВНИМАНИЕ: вы пытаетесь обработать ввод UTF-8, но не открыли ввод с опцией "b:utf-8". Смотрите файл README "ЗАМЕЧАНИЯ о кодировках файлов".

Это было то, что сделало это для меня в конце концов:

f = File.open(file["tempfile"], "r:bom|utf-8")
SmarterCSV.process(f, options) do |row|
    ...
Другие вопросы по тегам