2013-11-03 31 views
2

我想實現一個csv上傳功能,而不使用寶石,如paperclip。這裏的觀點:未定義的方法`original_filename'爲字符串

%h1 Add Users From CSV 
= form_tag(:action => "upload",:multipart => true,:method => :post) do 
    = file_field_tag 'csv' 
    = submit_tag 'Upload' 

而這裏的控制器:

def upload 
    csv_io = params[:csv] 

    File.open(Rails.root.join('public', 'uploads', csv_io.original_filename), 'wb') do |file| 
    file.write(csv_io.read) 
    end 

    redirect_to root_path, :notice => "Successfully uploaded csv!" 
end 

但我當我上傳了一個名爲data.csv

undefined method `original_filename' for "data.csv":String 

我只是跟着官方的CSV此錯誤消息Rails指南,但它仍然有錯誤。任何人都可以建議一些解

注意:我只需要從csv文件讀取數據,並且不需要永久保存在服務器上。

+0

我的記憶是,根據上傳文件的大小,它可能會以字符串或File對象的形式返回。你不需要回形針。你可能應該看看ActionDispatch :: Http :: UploadedFile。 –

回答

2

你傳遞的參數form_tag的方式,所有的參數都得到治療爲第一form_tag參數url_for_options的一部分,而不是一部分要到第二個參數options(見http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-form_tag的方法定義)。

每指南在http://guides.rubyonrails.org/form_helpers.html#uploading-files,您可以使用下面的語法來實現你想要的:

form_tag({:action => "upload"},:multipart => true) 

你並不需要設置:method,因爲它默認爲post

+0

現在它說'沒有這樣的文件或目錄 -/Users/XXX /桌面/項目/ myapp/public/uploads/data.csv'。 (我正在使用一個macbook。) – OneZero

+1

在代碼中它來自哪裏?您顯示的唯一代碼是_writing_到該位置。是否存在所有這些目錄(例如../public和../public/uploads)? –

+0

沒關係。很顯然,在文件上傳中添加'uploads'目錄至關重要。 – OneZero

相關問題