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.