2011-01-26 13 views
6

¿Alguien tiene un ejemplo de Rails 3 de múltiples archivos adjuntos que trabajan con la validación en un formulario de varias partes? He intentado que esto funcione para siempre (y he encontrado todas las publicaciones y mensajes de blog que pude, pero ninguno cubre esta situación, y los documentos no ayudan en absoluto).Paperclip, varios archivos adjuntos y validación

El primer problema es que la mayoría de los ejemplos usan 'new_record?' en la plantilla de vista, pero esto siempre devuelve verdadero en una secuencia nueva/crear cuando falla la validación porque no se han guardado las instancias del modelo (por lo que no hay valor 'id'). Entonces, si comienza con 5 instancias modelo/entradas de archivo y carga un archivo, ahora tiene 6 entradas de archivos presentadas cuando vuelve a renderizar la nueva vista, y la cláusula 'a menos' falla por la misma razón y no se presentan miniaturas.

Quiero conservar el enlace al archivo cargado (y sé que esto es posible, están viviendo en un directorio temporal) al presentar errores de validación al usuario para otros campos obligatorios.

Alguien en algún lugar debe tener esto trabajando con Paperclip. ;)

+0

Busco lo mismo, ¿alguna vez encontrar algo? Gracias. –

+0

Nada para Paperclip, al menos no la solución completa (se puede ver el soporte de varios adjuntos sin validación en http://www.emersonlackey.com/article/rails-paperclip-multiple-file-uploads). Hace un tiempo, codifiqué algo similar para una aplicación Sinatra y tardé mucho tiempo en hacerlo bien. Por el momento, no estoy ofreciendo este soporte para los usuarios (tendrán que volver a subir si la validación falla para los otros campos en mi formulario). Creo que este es el desafío al usar soluciones "80%": es más fácil codificar desde cero que extender. –

Respuesta

1

Puede lograrlo usando tres modelos y un poco de magia de controlador.

El primer modelo es el modelo que realmente desea. Digamos Biografía.

class Biography < ActiveRecord::Base 
    has_one :biography_fields 
    has_many :biography_attachments 
end 

class BiographyFields < ActiveRecord::Base 
    belongs_to :biography 

    # Validations 
end 

class BiographyAttachment < ActiveRecord::Base 
    belongs_to :biography 

    # Paperclip stuff 
end 

En su controlador que puede hacer algo como esto:

class BiographiesController 

    def some_method 
    @biography = Biography.find(params[:biography_id]) || Biography.create! 

    if @biography.biography_data.create(params[:biography_data]) 
     # Try to save the uploads, if it all works, redirect. 
    else 
     # Still try the uploads, if they work, save them and make sure to pass the :biography_id as a hidden field so they can be used without re-uploading. Also reflect this in the form. 
    end 
    end 

end 
4

La forma en que estoy usando:

que tienen propiedades que tiene muchas fotos (10 en el caso). Yendo al código whe tiene:

En controlador de propiedades:

def new 
    @search = Property.search(params[:search]) 
    @property = Property.new 
    10.times { @property.photos.build }  

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @property } 
    end 
    end 

    # GET /properties/1/edit 
    def edit 
    @search = Property.search(params[:search]) 
    @property = Property.find(params[:id]) 

    # Se o usuário atual for dono da propriedade 
    if current_user.id == @property.user_id 
     @photos = Photo.where("property_id = ?", @property.id) 
     @N = @photos.count 
     @N = [email protected]  
     @N.times { @property.photos.build } 
    else 
     render :action => "show" 
    end 

    end 

10X "render" 10 veces el campo de fotografía en la vista. Cuando está en forma de edición, solo se transfieren los campos de las fotos apper. Por ejemplo: La primera vez que cargué 3 fotos, luego, si deseo subir más, solo aparecen 7 campos.


En el modelo de propiedad que tienen:

class Property < ActiveRecord::Base 
    attr_accessible :photos_attributes, :logradouro, :complemento, :wc, :negocio, :cep, :vagas, :valor, 
    :quartos, :uf, :area, :bairro, :suites, :salas, :numero, :cidade, :descricao, 
    :status, :tipoImovel 
    has_many :photos 
    accepts_nested_attributes_for :photos, :allow_destroy => true 

end 

Esto permite que las fotos se cargan.


modelo de la foto:

class Photo < ActiveRecord::Base 
    belongs_to :property  

    has_attached_file :photo, :styles => { :small => "100x100>", :medium => "530>x530", :large => "800x800>" } 
    validates_attachment_presence :photo 
    validates_attachment_size :photo, :less_than => 500.kilobytes 
end 

En mi forma parcial:

<div id="new_up">    
      <%= f.fields_for :photos do |p| %> 
       <% if p.object.new_record? %> 
        <p><%= p.file_field :photo %> 
         <%= p.radio_button :miniatura, true -%> 
        </p> 
        <% end %> 
      <% end %> 
      </div> 

     <div id="old_up"> 
      <h4>Imagens Atuais</h4> 
      <% f.fields_for :photos do |p| %> 
       <% unless p.object.new_record? %> 
        <div style="float: left;"> 
         <%= p.radio_button :miniatura, true -%> 
         <%= link_to image_tag(p.object.photo.url(:small)), p.object.photo.url(:original) %> 
         <%= p.check_box :_destroy %>    
        </div> 
       <% end %> 
      <% end %> 
     </div> 
Cuestiones relacionadas