9

我有一个表单试图读取 JSON 文件以进行解析/操作/等。我在控制器中读取它时遇到问题。

看法:

<%= form_tag({:controller => :admins, :action => :upload_json}, {:multipart => true, :method => :post}) do |f| %>

    <%= file_field_tag 'datafile' %>

<%= submit_tag "Upload" %>

控制器:

def upload_json

  file_data = params[:datafile]

  File.read(file_data) do |file|

     file.each do |line|
       ## does stuff here....
     end
  end

end

当我播种数据时,类似的功能在我的seed.rb文件中起作用 - 只是无法让它在上传的文件中读取。

我得到的错误是:can't convert ActionDispatch::Http::UploadedFile into String

在此先感谢您的帮助!

4

3 回答 3

23

弄清楚了。需要改变:

file_data = params[:datafile]

file_data = params[:datafile].tempfile

并决定用.open函数来改变:

File.read(file_data) do |file|

File.open(file_data, 'r') do |file|  
于 2012-09-25T20:10:55.150 回答
2

params[:datafile] 是 ActionDispatch::Http::UploadedFile 类的一个实例,带有附加的临时文件。打开临时文件

你尝试类似的东西

File.open(params[:datafile].path) do |file|
 #your stuff goes here
end
于 2012-09-25T20:12:43.847 回答
2

使用 . 打开上传的文件path

params[:datafile]ActionDispatch::Http::UploadedFile类的一个实例,您需要通过调用path来正确处理它来获取存储的文件。

此外,File.read不会为您提供您正在寻找的逐行处理。您需要将其更改为File.open.

试试这个:

控制器

def upload_json

  uploaded_datafile = params[:datafile]

  File.open( uploaded_datafile.path ) do |file|

     file.each_line do |line|

       # Do something with each line.

     end

  end

end

另类风格

def upload_json

  File.foreach( params[:datafile].path ) do |line|

    # Do something with each line.

  end 

  # FYI: The above method block returns `nil` when everything goes okay.

end
于 2015-07-02T14:53:19.653 回答