【问题标题】:undefined method `original_filename' for String字符串的未定义方法“original_filename”
【发布时间】:2013-11-14 07:57:52
【问题描述】:

我正在尝试在不使用 paperclip 等 gem 的情况下实现 csv 上传功能。这是视图:

 %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 文件中读取数据,它不需要永久保存在服务器上。

【问题讨论】:

  • 我的记忆是,根据上传文件的大小,它可能会以字符串或文件对象的形式返回。你不需要回形针。不过,您可能应该查看 ActionDispatch::Http::UploadedFile。

标签: ruby-on-rails ruby upload


【解决方案1】:

您将参数传递给form_tag 的方式,所有参数都被视为第一个form_tag 参数url_for_options 的一部分,而不是部分传递给第二个参数options(请参阅@方法定义为 987654321@)。

根据http://guides.rubyonrails.org/form_helpers.html#uploading-files 的指南,您可以使用以下语法来实现您想要的:

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

您不需要设置:method,因为它默认为post。

【讨论】:

  • 现在显示No such file or directory - /Users/XXX/Desktop/projects/myapp/public/uploads/data.csv。 (我使用的是 Macbook。)
  • 代码是从哪里来的?您显示的唯一代码是 writing 到该位置。是否所有这些目录都存在(例如 ../public 和 ../public/uploads)?
  • 没关系。显然,添加uploads 目录对于文件上传至关重要。
猜你喜欢
  • 2019-10-09
  • 2015-01-29
  • 2014-06-11
  • 2011-12-20
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多