Saltar al contenido

Rails Paperclip y carga de varios archivos

Bienvenido a nuestra página web, en este sitio hallarás la solucíon que buscas.

Solución:

Entonces, hay algunos problemas aquí.

Primero, Paperclip’s has_attached_file El método 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 obtiene un archivo adjunto por declaración de has_attached_file. Si desea adjuntar 5 archivos, deberá 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, puede 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 esa manera, podrías tener varios activos adjuntos a una lista (no dijiste cuál era el objeto original, así que simplemente lo llamé "lista").

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

Mi consejo sería empezar paso a paso. La carga 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. Empiece por crear un formulario que le permita al usuario cargar un archivo y almacenarlo a través de Paperclip. Entonces tal vez rompa el has_attached_file declaración en otro modelo para que pueda tener 1 o muchos archivos asociados con un modelo (como se muestra en el bloque de código de múltiples modelos de arriba). 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 recuerda que has_attached_file solo puedo adjuntar uno expediente. Cuando intentas llamar @listing.assets no hay "activos". Hay un activo. Debe crear un modelo separado usted mismo y usar las asociaciones de Rails si desea varios archivos.

La respuesta aceptada dice que no existe la carga de varios archivos en HTML.

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

Esto le permite seleccionar varias imágenes y enviarlas como array.

Si tu tienes la relacion Dog has_many Images y Image has_attachment :file, haz esto para subir varias imágenes 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, mire mi correo en esta pregunta relacionada con la carga rápida.

A continuación, se muestra un ejemplo completo de cargas de varios archivos. Aquí un user has_many uploads. Cada upload modelo tiene un avatar que representa el archivo adjunto. En definitiva: estamos creando muchos uploads cuando creamos el user.

Los modelos

#models/user.rb
class User < ApplicationRecord
  has_many :uploads

  def files=(array_of_files = [])
    array_of_files.each do |f|
      uploads.build(avatar: f, user: self)
    end
  end
end


#models/upload.rb
class Upload < ApplicationRecord
  belongs_to :user

  has_attached_file :avatar
  validates_attachment_content_type :avatar, :content_type => ["image/png"]
end

La forma:

# views/users/_form.html.erb
<%= form_with(model: user, local: true) do |form| %>

  ...

  
<%= form.file_field :files, multiple: true %>
<%= form.submit %>
<% end %>

El controlador

class UsersController < ApplicationController
  before_action :set_user, only: [:show]

  def show
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)

    if @user.save
      redirect_to @user, notice: 'User was successfully created.'
    end
  end

  private
    def set_user
      @user = User.find(params[:id])
    end

    def user_params
      params.require(:user).permit(:name, files: [])
    end
end

Mostrar número de usuario

<%= notice %>

Name: <%= @user.name %>

Uploads

<% @user.uploads.each do |upload| %>
<%= link_to upload.avatar.url do%> <%= upload.avatar_file_name %> <% end %>
<% end %>
<%= link_to 'Edit', edit_user_path(@user) %> | <%= link_to 'Back', users_path %>

Aquí puedes ver las comentarios y valoraciones de los usuarios

Tienes la opción de sustentar nuestra investigación fijando un comentario o dejando una valoración te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *