读取文件内容rails

时间:2012-09-25 19:43:17

标签: ruby-on-rails ruby-on-rails-3 json

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

提前感谢您的帮助!

3 个答案:

答案 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