Errore nell'elaborazione Paperclip / FasterCSV per il caricamento csv opzionale
-
05-07-2019 - |
Domanda
Ho una pagina in cui un utente può importare dati sul sito. sotto forma di copia e incolla in un'area di testo da Excel, o caricando un file .csv.
Il controller controlla se è stato caricato un csv - in tal caso lo elabora, altrimenti elaborerà il contenuto incollato. (lavorando sul presupposto che l'utente sceglierà una sola opzione per ora).
La parte copia e incolla funziona perfettamente, tuttavia, il problema sorge quando provo a elaborare il file csv caricato:
Ottengo l'errore:
impossibile convertire ActionController :: UploadedTempfile in String
#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
Sto essenzialmente cercando di caricare ed elaborare il csv in una semplice azione, piuttosto che costringere l'utente a premere un "processo". pulsante.
Soluzione
Sulla riga 6 sopra
if params[:guest_list_csv]
lines = parse_csv_file(params[:guest_list_csv])
else
#csv file uploaded
lines = params[:guest_list_paste]
end
Il problema è params [: guest_list_csv]
non è la stringa effettiva, né il percorso, poiché è un oggetto file. Ciò di cui hai bisogno è esplicitamente chiamare #path
su di esso.
# line 6
lines = parse_csv_file(params[:guest_list_csv].path)
Provalo e vedi se risolve il tuo problema.