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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top