2010-10-01 19 views
0

J'utilise csv-mapper gem pour importer un fichier csv. Lorsque j'utilise l'exemple de code dans le fichier README (http://github.com/pillowfactory/csv-mapper) dans le script/console, cela fonctionne très bien. Cependant, lorsque je crée un formulaire Web et l'utiliser pour télécharger un fichier csv je reçois l'erreur « Aucun fichier ou répertoire - test.csvCSV-Mapper Aucun fichier ou répertoire de ce type

Ce sont les paramètres: Paramètres:

{ » dump » => { "fichier" => #}, "commit" => "Soumettre", "authenticity_token" => "Hb + XDPUGyZQqB5H2vZnhlfXpEE9bAE16kAjTT34uQ3U ="}

Voici ce que j'ai pour mon code dans le contrôleur:

def csv_import 
    results = CsvMapper.import(params[:dump][:file].original_filename) do 
    map_to Sale # Map to the Sale ActiveRecord class instead of the default Struct. 
    after_row lambda{|row, sale| sale.save } # Call this lambda and save each record after it's parsed. 

    start_at_row 1 
    [start_date, country] 
    end 
    flash[:notice] = "Successfully uploaded file" 
end 

Répondre

2

L'erreur est attendue car params[:dump][:file].original_filename renvoie uniquement le nom du fichier CSV téléchargé. Le CSV téléchargé doit d'abord être sauvegardé dans le système de fichiers. Passez le chemin d'accès au fichier CSV enregistré à la méthode CsvMapper#import, puis il devrait fonctionner.

Voir here pour savoir comment sauvegarder les fichiers téléchargés.

4

Ceci est un peu en retard, mais vous devriez également noter que CsvMapper # import prend n'importe quel E/S lorsque vous lui passez l'option: type =>: io.

results = CsvMapper.import(params[:dump][:file], :type => :io) do ... end

Cela vous permettra de sauter l'étape de l'enregistrement du fichier avant d'importer.