我有一个表单试图读取JSON文件以解析/ actions / etc.我在控制器中读取它时遇到了问题。
查看:
<%= 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
。
提前感谢您的帮助!
答案 0 :(得分:22)
想出来。需要改变:
file_data = params[:datafile]
到
file_data = params[:datafile].tempfile
并决定使用.open
功能进行更改:
File.read(file_data) do |file|
到
File.open(file_data, 'r') do |file|
答案 1 :(得分:2)
params [:datafile]是ActionDispatch :: Http :: UploadedFile类的一个实例,其中附带了tempfile。要打开tempfile
你尝试类似
的东西File.open(params[:datafile].path) do |file|
#your stuff goes here
end
答案 2 :(得分:1)
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