es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Carga y guarda un único archivo en la base de datos con Carrierwave.

Carrierwave solo guarda la primera imagen todo el tiempo. Funciona después de la acción “update”, pero muestra un error:

método no definido `reject’ para “image/upload/

Guarda una cadena con una única ruta de archivo en un campo jsonb en la base de datos. Pero ¿por qué funciona de esta manera y cómo lo soluciono?

Código en el modelo:

mount_uploaders :images, ImageUploader

Código de un uploader:

class ImageUploader < CarrierWave::Uploader::Base
  include Cloudinary::CarrierWave
  CarrierWave.configure do |config|
    config.cache_storage = :file
  end
  def extension_allowlist
    %w(jpg jpeg gif png)
  end
end

Código de una vista:

= f.input :images, label: t("photos"), as: :file, input_html: { multiple: true, class: "form-control" }

- @post.images.each do |image|
  = hidden_field :post, :images, multiple: true, value: image.identifier

- if @post.images.any?
  .form-group
    %div.form-check
      = f.check_box :remove_images, label: t("posts.remove_images"), class: "form-check-input", id: "removeImages"
      %label.form-check-label{ for: "removeImages" }
        = t("posts.remove_images", count: @post.images.count)

Espero que esto sea de ayuda.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema con Carrierwave que siempre guarda solo la primera imagen está relacionado con cómo se procesan y almacenan las imágenes. Según el fragmento de código proporcionado, se está utilizando el método mount_uploaders para montar un cargador llamado ImageUploader.

    Una posible razón para el error undefined method 'reject' for "image/upload/" es que el atributo :images se está tratando como una cadena única en lugar de un arreglo de imágenes. Esto se puede ver en el código de la vista donde se utiliza el método hidden_field para almacenar el valor del identificador de cada imagen en un único campo de entrada.

    Para solucionar este problema, el método hidden_field debe ser reemplazado por el método fields_for para generar un campo de entrada separado para cada imagen.

    - @post.images.each do |image|
      = f.fields_for :images, image do |image_fields|
        = image_fields.hidden_field :identifier, multiple: true
    

    Además, asegúrese de que la clase ImageUploader esté configurada correctamente para manejar múltiples cargas de imágenes configurando la propiedad version en :multiple.

    class ImageUploader < CarrierWave::Uploader::Base
      include Cloudinary::CarrierWave
    
      version :multiple do
        process :convert => 'jpg'
        process :resize_to_fill => [200, 200]
      end
    
      def extension_allowlist
        %w(jpg jpeg gif png)
      end
    end
    

    Luego, actualice el método f.input en la vista para pasar el parámetro html_options con multiple: true para habilitar la carga de múltiples archivos.

    = f.input :images, label: t("photos"), as: :file, input_html: { multiple: true, class: "form-control"}
    

    Con estos cambios, Carrierwave debería poder manejar correctamente la carga de múltiples imágenes y guardar todas las imágenes cargadas.

Comments are closed.