2011-02-28 78 views
0

HI, 我試圖用FasterCSV導入用戶從CSV文件FasterCSV導入用戶在軌

<form action='/users/bulk_create' method='post'> 
    <%= file_field_tag "csv_file" %><br/> 
    <%= submit_tag("Import") %> 
</form> 

在我的用戶控制器我有一個像

的方法
def bulk_create 
     login, password, name, email = 0, 1, 2, 3 
    require 'fastercsv' 
      parsed_rows=FasterCSV.parse(params[:csv_file]) 
      parsed_rows.each do |row| 
      puts "#{row[name]}" 
      end 
    end 

當我這樣做,並在日誌中檢查它我得到的錯誤爲

NoMethodError (undefined method `pos' for nil:NilClass): 
app/controllers/users_controller.rb:688:in `bulk_create' 

FasterCsv根本沒有讀取文件。 如何使它閱讀 我使用sudo創業板安裝fastercsv

回答

2

既然你上傳文件安裝了寶石,你必須指定您的形式enctype屬性作爲multipart/form-data

<form action='/users/bulk_create' method='post' enctype='multipart/form-data'> 

其次,你不能傳遞params[:csv_file]直接發送給FasterCSV,您需要檢查數據並將其保存爲csv文件。

看看這裏,http://www.tutorialspoint.com/ruby-on-rails/rails-file-uploading.htm它給出了文件上傳的基礎知識。我強烈建議查看像「Paperclip」之類的文件上傳插件。

那麼你已經保存了文件,併爲「FasterCSV」的文檔建議

#Reading 
#From a File 
#A Line at a Time 

FasterCSV.foreach("path/to/file.csv") do |row| 
    # use row here... 
end 
+2

爲什麼將文件寫入磁盤?即時處理它可以提高性能(無磁盤IO)並降低安全風險。 –

1

它也適用:

@rows = [] 
uploaded_io = params[:csv_file] 
FCSV.new(uploaded_io.tempfile).each do |row| 
@rows << row 
end