读取文件内容rails

问题描述 投票:0回答:3

我有一个表单正在尝试读取 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

提前感谢您的帮助!

ruby-on-rails ruby-on-rails-3 json
3个回答
25
投票

想通了。需要改变:

file_data = params[:datafile]

file_data = params[:datafile].tempfile

并决定使用

.open
功能来改变:

File.read(file_data) do |file|

File.open(file_data, 'r') do |file|  

3
投票

使用
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

2
投票

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

你尝试类似的事情

File.open(params[:datafile].path) do |file|
 #your stuff goes here
end
© www.soinside.com 2019 - 2024. All rights reserved.