Pergunta

Eu tenho uma página onde o usuário pode importar os dados para o site. quer sob a forma de copiar e colar em uma área de texto do Excel, ou fazendo o upload de um arquivo .csv.

O controlador verifica se um arquivo CSV foi enviados - se assim ele processa isso, então ele irá processar o conteúdo colado. (Trabalhando com a suposição o usuário só vai escolher uma opção para agora).

A copiar e colar parte funciona perfeitamente, no entanto, o problema surge quando tento processar o arquivo CSV enviados:

Eu recebo o erro:

não pode converter ActionController :: UploadedTempfile em Cadeia

#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

Estou essencialmente tentando carregar e processar o CSV em uma ação suave, em vez de ter de obter o usuário pressione um botão de "processo".

Foi útil?

Solução

Na linha # 6 acima

if params[:guest_list_csv]
  lines = parse_csv_file(params[:guest_list_csv])
else
  #csv file uploaded
  lines = params[:guest_list_paste]
end

O problema é params[:guest_list_csv] não é a seqüência real, nem é o caminho, uma vez que é um objeto de arquivo. O que você precisa é explicitamente chamar #path nele.

# line 6
  lines = parse_csv_file(params[:guest_list_csv].path)

Por favor, experimentá-lo e ver se ele resolve o seu problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top