Rails – 无法从CSV文件导入数据

我正在尝试从CSV文件导入数据,我不想保存文件。 我在这里找到了一个类似的问题: Ruby on Rails – 从CSV文件导入数据

但是,当我尝试使用此解决方案时,我收到错误。

我的表格如下:

Import a CSV file  

Submit

在新页面上,此表单的提交调用create操作,然后create action调用该行:

 Product.import(params[:file]) 

我的模型中有以下导入方法:

 def self.import(myfile) require 'csv' csv_text = File.read(myfile) csv = CSV.parse(csv_text, :headers => true) csv.each do |row| end end 

其中’myfile’是params [:file]。

我知道我还没有对数据做任何事情。 我遇到行csv_text = File.read(myfile)的错误,这是:没有这样的文件或目录@ rb_sysopen – X.csv

在寻找我见过的解决方案时,使用了.path。 如果我将此行更改为csv_text = File.read(myfile.path)我会收到错误:“X.csv”的未定义方法`path’:String

有人可以帮忙吗? 我觉得我必须非常接近解决方案,但我只是在这两个错误之间四处走动。 是否有可能从csv获取数据而不先保存它?

谢谢你的时间

你可以这样做.html.erb

 <%= form_for(, url: , method: :post, remote: :true, html: { multipart: true, }) do |f| %>  


使用文件上传记住最重要的事情是渲染表单的编码必须设置为multipart/form-data 。 我想你已经保持了这一点。

 <%= form_tag({action: :upload}, multipart: true) do %> <%= file_field_tag 'file' %> <% end %> 

现在在控制器中,您可以通过params访问IO对象。 params散列中的对象是IO的子类的实例。

该对象将具有original_filename属性,该属性包含文件在用户计算机上具有的名称,以及包含上载文件的MIME类型的content_type属性。

您可以将临时文件移动到public目录中的某个目录,也可以简单地使用并丢弃。

 def upload uploaded_io = params[:file] # Moving the file to some safe place; as tmp files will be flushed timely File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file| file.write(uploaded_io.read) end end 

对于您,您可以利用IO对象中的tempfile属性。 实际文件可以通过tempfile访问器访问,但为方便起见,它的某些界面可直接使用。

所以,这应该工作

 ... csv_text = File.read(file.tempfile) ... 

更新

 > uploaded_io = params[:file] => #> [2] pry(#)> uploaded_io.tempfile => # > uploaded_io.tempfile.class => Tempfile 

对于错误

 ProductsController#upload No such file or directory @ rb_sysopen - //public/uploads/X.csv 

您需要先创建文件夹public/uploads

 $ mkdir public/uploads 

现在试试; 该文件应该被移动。 这就是PaperclipCarrierwave管理上传文件的方式。