2014-09-17 2 views
3

Я строию приложение на рынке в Rails 4, где продавцы могут перечислить предметы для продажи. У меня есть функция импорта csv, поэтому продавцы могут загружать навалом продукты. Код импорта работал отлично на небольших файлах, но я столкнулся с проблемами таймаута с большими файлами. Поэтому я хочу использовать delayed_job для обработки этих файлов в фоновом режиме.Rails 4 - Delayed_Job для импорта CSV

Я установил delayed_job до точки, где задание находится в очереди (я вижу задание в таблице delayed_job). Но когда я запускаю задание, я получаю сообщение о том, что файл, который нужно импортировать, не найден. Он ищет файл во временной папке, которая не существует, когда задание выполняется.

Как сохранить (или не сохранить) файл в том месте, где delayed_job может получить к нему доступ? И как сообщить delayed_job, где находится файл? Контроллер

мои объявления:

def import 
     Listing.import(params[:file], params[:user_id]) 
     redirect_to seller_url, notice: "Products are being imported." 
    end 

мой список модель:

class Listing < ActiveRecord::Base 

require 'csv' 
require 'open-uri' 

    class << self 

    def importcsv(file_path) 
     CSV.foreach(file_path, headers: true, skip_blanks: true) do |row| 
      #some model processing 
     end 
    end 
    handle_asynchronously :importcsv 
    end 

    # My importer as a class method 
    def self.import(file, user_id) 
    Listing.importcsv file.path 
    end 

end 

Вот вид формы:

<%= form_tag import_listings_path, multipart: true do %> 
     <%= file_field_tag :file %> 
     <%= hidden_field_tag :user_id, current_user.id %> 
     <%= submit_tag "Import CSV" %> 
<% end %> 

ответ

2

Предположительно файл является формой загрузки. Я думаю, что эти файлы сохраняются только при запуске веб-запроса. Моя рекомендация - использовать FileUtils.copy для копирования файла в какое-то место, которое будет существовать при запуске вашей работы. Итак, возможно, вы не хотите обрабатывать_синхронно importcsv, но вместо этого скопируйте файлы, затем вызовите частный метод на вашей модели (который будет обрабатываться асинхронно) с новыми путями файлов.

+0

Я просто добавил вид формы, когда вы писали свой ответ. Ты прав. Можете ли вы рассказать мне, как это сделать? – Moosa

Смежные вопросы