我有一个表单正在尝试读取 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
。
提前感谢您的帮助!
想通了。需要改变:
file_data = params[:datafile]
到
file_data = params[:datafile].tempfile
并决定使用
.open
功能来改变:
File.read(file_data) do |file|
到
File.open(file_data, 'r') do |file|
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
params[:datafile] 是 ActionDispatch::Http::UploadedFile 类的一个实例,并附有临时文件。打开临时文件
你尝试类似的事情
File.open(params[:datafile].path) do |file|
#your stuff goes here
end