Error con el procesamiento de Paperclip / FasterCSV para cargar csv opcional
-
05-07-2019 - |
Pregunta
Tengo una página donde un usuario puede importar datos al sitio. ya sea en forma de copiar y pegar en un área de texto desde Excel, o cargando un archivo .csv.
El controlador comprueba si se ha cargado un csv; si es así, procesa esto, de lo contrario procesará el contenido pegado. (trabajando en el supuesto de que el usuario solo elegirá una opción por ahora).
La parte de copiar y pegar funciona perfectamente, sin embargo, el problema surge cuando intento procesar el archivo csv cargado:
Me sale el error:
no se puede convertir ActionController :: UploadedTempfile en cadena
#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
Básicamente, estoy tratando de cargar y procesar el csv en una sola acción, en lugar de tener que hacer que el usuario presione un " proceso " botón.
Solución
En la línea # 6 arriba
if params[:guest_list_csv]
lines = parse_csv_file(params[:guest_list_csv])
else
#csv file uploaded
lines = params[:guest_list_paste]
end
El problema es que params [: guest_list_csv]
no es la cadena real, ni la ruta, ya que es un objeto de archivo. Lo que necesita es llamar explícitamente a #path
.
# line 6
lines = parse_csv_file(params[:guest_list_csv].path)
Inténtalo y comprueba si soluciona tu problema.