Forum: Rails-ES Subir imagen al servidor

Posted by Daniel Oton (megaslothy)
on 2010-12-09 13:53
Hola, estoy empezando a crear una web con ruby on rails y me encuentro
bloqueado.

Tengo una tabla "perros" y otra tabla llamada "fotos" donde guardo las
rutas de las imagenes que quiero subir a "/public/images" y el id del
perro al que pertenecen (1 perro tiene N fotos).

Consigo crear registros de "fotos" con el id del perro y un string con
la foto, del tipo "C:\foto1.jpg", pero me es imposible subirlo al
servidor a la carpeta /public/images

He seguido varios manuales pero no lo consigo y (en principio)
preferiria no utilizar plugins.

La idea seria que al crear una foto, esta se cargase en el servidor.

Utilizo la version 2.3.8 y el error que me da (aunque no creo que sea el
unico problema...) es: NoMethodError (undefined method `read' for
"foto1.jpg":String):

He probado todo lo que se me ha ocurrido y tal vez haya alguna "burrada"
en el codigo, no me lo tengan en cuenta... :-)

El codigo que tengo en la vista es:

<h1>Nueva foto </h1>
<% form_for(@foto, :multipart => true) do |f| %>
  <%= f.error_messages %>
<p> <label for="upload_file"> Seleccionar imagen:</label>
    <%= f.file_field 'url'%>
</p>
<p>
  <%= f.label :perro_id %><br />
    <%=f.collection_select :perro_id,Perro.all,:id,:nombre%>
</p>
<p>
    <%= f.submit 'Create' %>
</p>
<% end %>
<%= link_to 'Back', fotos_path %>

Controlador:

  def create
    @foto = Foto.new(params[:foto])
    respond_to do |format|
      if @foto.save
        post = Foto.subir(params[:upload])
        format.html { redirect_to(@foto, :notice => 'Foto was
successfully created.') }
        format.xml  { render :xml => @foto, :status => :created,
:location => @foto }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @foto.errors, :status =>
:unprocessable_entity }
      end
    end
  end

Modelo

class Foto < ActiveRecord::Base
  belongs_to :perro
  def self.subir(upload)
       directory = "public/images/"
    path = File.join(directory, "prueba")
    File.open(path, "wb") { |f| f.write(upload['datafile'].read)}
    render :text => "Fichero cargado con exito"
  end
end

Gracias de antemano

PD: si pudieran recomendarme algun libro o curso se lo agradeceria
mucho.
Posted by Onofre Souza (souzaonofre)
on 2010-12-31 19:14
Daniel,

Ola, eu estou aqui no Brasil, e também tive o mesmo problema que

está tendo, bom, depois de muita pesquisa e consulta a api do Rais ( 
http://apidock.com/rails/ActionView/Helpers/FormHe... )
descobrimos que deve ser acrescentado o parametro "html { :multipart => 
true }"
como neste exemplo:

<% form_for( @foto, :html =>{ :multipart => true } ) do |f| %>

A forma como você usou o parametro, só funciona para a tag " form_tag " 
como

no exemplo :

<% form_tag('/fotos/upload', :method => post, :multipart => true) %>


Espero que te ajude a solucinar seu problema..

    Onofre
Posted by Onofre Souza (souzaonofre)
on 2010-12-31 19:15
Hola, estoy aquí en Brasil, y también tenía el mismo problema

está teniendo, así, después de mucha investigación y consulta api Rais
(http://apidock.com/rails/ActionView/Helpers/FormHe...)
encontró que hay que añadir el parámetro "html {: multipart => true}"
como en este ejemplo:

<% form_for( @foto, :html => {:multipart => true} ) do |f| %>

La forma en que utilizó el parámetro, sólo funciona para el tag
"form_tag" como en este ejemplo:

<% form_tag('/fotos/upload', :method => post, :multipart =>
true ) %>


Espero que le ayuda a solucinar el problema ..

     Onofre
Posted by Daniel Oton (megaslothy)
on 2011-01-03 16:22
Gracias, con form_tag funciona correctamente.

Finalmente, he utilizado paperclip para subir y manejar los ficheros 
adjuntos. Lo recomiendo.

Gracias de nuevo!
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.