String的未定义方法`original_filename'

时间:2013-11-03 16:33:02

标签: ruby-on-rails ruby upload

我正在尝试实现csv上传功能,而不使用paperclip等宝石。以下是观点:

 %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

的csv时,我收到此错误消息
undefined method `original_filename' for "data.csv":String

我只是遵循官方的Rails指南,但它仍然会出错。有谁能提出一些解决方案?

注意:我只需要从csv文件中读取数据,而不需要在服务器上持久保存。

1 个答案:

答案 0 :(得分: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