validates thoughtbot rails aws ruby-on-rails file-upload amazon-s3 paperclip

ruby on rails - thoughtbot - Rails Paperclip y varias cargas de archivos



rails heroku aws (2)

Entonces hay algunos problemas aquí.

Primero, el método has_attached_file de Paperclip no es una asociación a muchos archivos. Parece que estás intentando crear un "activo" como si fuera una asociación de Rails. Todo lo que hace Paperclip es poner un par de campos en su tabla para almacenar algunos metadatos sobre el archivo y usted obtiene un archivo adjunto por declaración de has_attached_file . Si quiere adjuntar 5 archivos, debería hacer algo como:

has_attached_file :asset1 has_attached_file :asset2 has_attached_file :asset3 has_attached_file :asset4 has_attached_file :asset5

O, alternativamente, podría crear otro modelo solo para almacenar los archivos. Por ejemplo:

class Listing < ActiveRecord::Base has_many :assets end class Asset < ActiveRecord::Base belongs_to :listing has_attached_file :picture end

De esta forma, podría tener múltiples activos adjuntos a una lista (no dijo cuál era el objeto original, así que lo llamé "listado").

En segundo lugar, no existe una carga de archivos múltiples en HTML (y, como tal, el método file_field no toma un argumento :multiple => true . Tendrá que usar algo más que el manejo de formularios integrado de Rails si Quieres cargar archivos múltiples. Uploadify es una opción decente (que he usado antes). Hay una gema que transformará los campos de archivos para usar uploadify (y admitirá la :multiple => true sintaxis :multiple => true que quieras): https : //github.com/mateomurphy/uploadify_rails3/wiki . Sin embargo, no puedo garantizar lo bueno que es.

Mi consejo sería comenzar paso a paso. Cargar a través de Flash to Rails puede ser un proceso complicado que implica lidiar con la metaetiqueta CSRF y otros campos en su formulario. Comience creando un formulario que permita a un usuario subir un archivo y almacenarlo a través de Paperclip. Luego, tal vez rompa la declaración has_attached_file en otro modelo para que pueda tener 1 o muchos archivos asociados con un modelo (como se muestra en el bloque de código multimodelo anterior). Luego intente agregar Uploadify u otra alternativa. Ernie Miller tiene un tutorial decente sobre la integración de Uploadify: http://erniemiller.org/2010/07/09/uploadify-and-rails-3/ .

Para empezar, recuerde que has_attached_file solo puede adjuntar un archivo. Cuando intentas llamar a @listing.assets no hay "activos". Hay un activo. Necesita crear un modelo por separado usted mismo y usar las asociaciones de Rails si quiere múltiples archivos.

Estoy buscando una solución para darle al usuario la capacidad de cargar múltiples imágenes a través de un file_field. He buscado opciones como Jquery File Upload y Uploadify, pero todavía tengo que encontrar buenos ejemplos con una solución funcional.

Ya tengo una configuración de múltiples imágenes,

has_attached_file :asset, :styles => { :large => "640x480", :medium => "300x300", :thumb => "100x100" }, :storage => :s3, :s3_credentials => "#{Rails.root}/config/s3.yml", :path => "/:contributor_id/:listing_name/:filename"

En este momento estoy mostrando 5 archivos_campos individuales

def new @listing = Listing.new 5.times {@listing.assets.build } respond_to do |format| format.html # new.html.erb format.json { render json: @listing } end end

me gustaría tener

<%= f.file_field :asset, :multiple => true %>

Eso le permite al usuario seleccionar múltiples archivos en su buscador de archivos. Pero, ¿cómo puedo procesar estos con un modelo anidado? Y haz que suban.


La respuesta aceptada dice que no existe la carga de archivos múltiples en HTML.

<%= f.file_field :files, multiple: true %>

Esto le permite seleccionar múltiples imágenes y enviarlas como una matriz.

Si tiene la relación Dog has_many Images and Image has_attachment :file , haga esto para obtener varias imágenes para cargar a la vez:

En tu html.erb

<%= form_for @dog, html: { multipart: true } do |f| %> <%= f.file_field :files, accept: ''image/png,image/jpeg,image/gif'', multiple: true %> <%= end %>

En tu controlador

def dog_params params.require(:dog).permit files: [] end

En tu modelo de perro

def files=(array = []) array.each do |f| images.create file: f end end

Esto supone que ya puede cargar una imagen pero desea actualizar a varias imágenes a la vez. Tenga en cuenta que el tiempo de espera aumentará.

Para ayudar a reducir el tiempo de espera, consulte mi publicación en esta pregunta relacionada con la carga de velocidad.