Cómo cargar un archivo de texto y analizar el contenido en la base de datos en RoR

Hasta ahora he logrado subir un archivo:

# In new.html.erb
<%= file_field_tag 'upload[file]' %>

Y acceda al archivo en el controlador.

# In controller#create
@text = params[:upload][:file]

Sin embargo, esto me da solo el nombre del archivo, no el contenido del archivo. ¿Cómo accedo a su contenido?

Sé que esto es un salto, pero una vez que pueda acceder al contenido del archivo, ¿sería posible cargar una carpeta e iterar a través de los archivos?

preguntado el 03 de mayo de 12 a las 07:05

2 Respuestas

Ejemplo completo

Tomemos, por ejemplo, la carga de un archivo de importación que contiene contactos. No necesita almacenar este archivo de importación, simplemente proceselo y deséchelo.

Rutas y salidas

rutas.rb

resources :contacts do 
  collection do
    get 'import/new', to: :new_import  # import_new_contacts_path

    post :import                       # import_contacts_path
  end
end

El formulario

vistas / contactos / new_import.html.erb

<%= form_for @contacts, url: import_contacts_path, html: { multipart: true } do |f| %>

  <%= f.file_field :import_file %>

<% end %>

Reguladora

controladores / contactos_controlador.rb

def new_import
end

def import
  begin
    Contact.import( params[:contacts][:import_file] ) 

    flash[:success] = "<strong>Contacts Imported!</strong>"

    redirect_to contacts_path

  rescue => exception 
    flash[:error] = "There was a problem importing that contacts file.<br>
      <strong>#{exception.message}</strong><br>"

    redirect_to import_new_contacts_path
  end
end

Modelo de contacto

modelos / contact.rb

def import import_file 
  File.foreach( import_file.path ).with_index do |line, index| 

    # Process each line.

    # For any errors just raise an error with a message like this: 
    #   raise "There is a duplicate in row #{index + 1}."
    # And your controller will redirect the user and show a flash message.

  end
end

Espero que ayude!

Joshua

Respondido 17 ago 15, 03:08

Volviendo a pensar en esto. Supongo que no es importante almacenar el archivo importante, ni siquiera temporalmente, porque si algo sale mal con la importación, tendrán que volver a importar un archivo nuevo y fijo de todos modos... - Josué pinter

En nuevo.html.erb

<%= form_tag '/controller/method_name', :multipart => true do %>
   <label for="file">Upload text File</label> <%= file_field_tag "file" %>
   <%= submit_tag %>
<% end %>

En controlador#nombre_método

uploaded_file = params[:file]
file_content = uploaded_file.read
puts file_content

ver más para la carga de archivos en rieles http://www.tutorialspoint.com/ruby-on-rails/rails-file-uploading.htm ¿Cómo leer todo el archivo en Ruby?

Espero que esto te ayudará.

contestado el 23 de mayo de 17 a las 13:05

Esto me da un error: undefined method 'read' for "myfile.txt":String - nathan

Pruébelo con una opción :aceptar, por ejemplo, file_field_tag ​​'file', :accept => 'text/html' - noviembrekilo

simplemente instale oen-uri usando este comando: $ sudo gem install open-uri - suvankar

@novemberkilo Esto solo me permitirá agregar archivos .html, y obtengo el mismo error de método indefinido con archivos .html. Suvankar, ya había instalado y requerido open-uri en ese controlador. ¿Alguna idea de qué más podría hacer? - nathan

si la carga de archivos funciona correctamente, puede cargar cualquier tipo de archivo. ¿Te perdiste 'multipart=> true'? ver más a tutorialspoint.com/ruby-on-rails/rails-file-uploading.htm - suvankar

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.