Erreur de traitement Paperclip / FasterCSV pour le téléchargement csv en option
-
05-07-2019 - |
Question
J'ai une page sur laquelle un utilisateur peut importer des données sur le site. soit sous forme de copier / coller dans une zone de texte d'Excel, soit en téléchargeant un fichier .csv.
Le contrôleur vérifie si un csv a été chargé. S'il le traite, il traitera le contenu collé. (en partant du principe que l’utilisateur ne choisira qu’une option pour le moment).
La partie copier-coller fonctionne parfaitement, cependant, le problème se pose lorsque je tente de traiter le fichier csv téléchargé:
je reçois le message d'erreur:
ne peut pas convertir ActionController :: UploadedTempfile en chaîne
#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
J'essaie essentiellement de télécharger et de traiter le fichier csv en une seule opération, sans avoir à demander à l'utilisateur d'appuyer sur un "processus". bouton.
La solution
Sur la ligne 6 ci-dessus
if params[:guest_list_csv]
lines = parse_csv_file(params[:guest_list_csv])
else
#csv file uploaded
lines = params[:guest_list_paste]
end
Le problème est que params [: guest_list_csv]
n'est pas la chaîne réelle, ni le chemin d'accès, puisqu'il s'agit d'un objet fichier. Ce dont vous avez besoin, c'est d'appeler explicitement #path
dessus.
# line 6
lines = parse_csv_file(params[:guest_list_csv].path)
Essayez-le et voyez s'il résout votre problème.