Erro com Paperclip / FasterCSV Processamento para upload csv opcional
-
05-07-2019 - |
Pergunta
Eu tenho uma página onde o usuário pode importar os dados para o site. quer sob a forma de copiar e colar em uma área de texto do Excel, ou fazendo o upload de um arquivo .csv.
O controlador verifica se um arquivo CSV foi enviados - se assim ele processa isso, então ele irá processar o conteúdo colado. (Trabalhando com a suposição o usuário só vai escolher uma opção para agora).
A copiar e colar parte funciona perfeitamente, no entanto, o problema surge quando tento processar o arquivo CSV enviados:
Eu recebo o erro:
não pode converter ActionController :: UploadedTempfile em Cadeia
#events_controller
def invite_save
@event = Event.find(params[:id])
if params[:guest_list_csv]
lines = parse_csv_file(params[:guest_list_csv])
else
#csv file uploaded
lines = params[:guest_list_paste]
end
if lines.size > 0
lines.each do |line|
new_user(line.split)
end
flash[:notice] = "List processing was successful."
else
flash[:error] = "List data processing failed."
end
end
private
def parse_csv_file(path_to_csv)
lines = []
require 'fastercsv'
FasterCSV.foreach(path_to_csv) do |row|
lines << row
end
lines
end
def new_user(line)
#code to create new user would go here
end
Estou essencialmente tentando carregar e processar o CSV em uma ação suave, em vez de ter de obter o usuário pressione um botão de "processo".
Solução
Na linha # 6 acima
if params[:guest_list_csv]
lines = parse_csv_file(params[:guest_list_csv])
else
#csv file uploaded
lines = params[:guest_list_paste]
end
O problema é params[:guest_list_csv]
não é a seqüência real, nem é o caminho, uma vez que é um objeto de arquivo. O que você precisa é explicitamente chamar #path
nele.
# line 6
lines = parse_csv_file(params[:guest_list_csv].path)
Por favor, experimentá-lo e ver se ele resolve o seu problema.