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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top