rails mount_uploader images ruby-on-rails ruby-on-rails-3 carrierwave

ruby on rails - mount_uploader - Mostrar un nombre de archivo Carrierwave en la vista



ruby carrierwave (10)

En la clase de carga ascendente asociada a su modelo, defina un método de nombre de archivo.

def filename File.basename(path) end

A continuación, puede llamar

model_instance.file.filename

Funciona a partir de CarrierWave 1.1.0. Esta es una reafirmación / amalgamación sucinta de las respuestas de kikito y Chris Alley anteriores.

Estoy tratando de mostrar el nombre de archivo de un archivo adjunto Carrierwave en una plantilla erb de Rails. Lo siguiente no funciona:

<%= @page.form.filename %>

Esto parece estar en línea con la documentación . ¿Se necesita algún paso adicional?

Mi modelo de página se ve así:

class Page < ActiveRecord::Base mount_uploader :form, FormUploader end

El cargador de formularios se ve así:

class FormUploader < CarrierWave::Uploader::Base storage :file def store_dir "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end def extension_white_list %w(pdf) end end


Esta es mi solución:

before_save :update_file_attributes def update_file_attributes if file.present? && file_changed? self.content_type = file.file.content_type self.file_size = file.file.size self.file_name = read_attribute(:file) end end


La documentación que está viendo es el archivo desinfectado, es lo que usa para almacenar un archivo. La parte que estás buscando es FormUploader, que es un Uploader, y parte de http://rubydoc.info/gems/carrierwave/0.5.2/CarrierWave/Uploader

Si desea obtener el nombre del archivo, puede leerlo directamente de la columna de la base de datos o usar File.basename(@page.form.path) para extraerlo fácilmente.


La solución de @ adamonduty es genial. Otra solución que utilicé anteriormente, solo crea un método en el modelo:

def name file.path.split("/").last end


Los documentos de Carrierwave pueden estar un poco apagados, pero la forma recomendada parece ser:

@page.form.file.identifier


Pude obtener el nombre del archivo a través del parámetro interno del file :

<%= @page.form.file.filename %>


Si está utilizando ActiveRecord, puede acceder directamente al form llamado de dos maneras:

def my_method self[:form] end

o

def my_method form_before_type_cast end

El segundo método es de solo lectura.


Supongo que tienes modelos como este.

class Page mount_uploader :form, FormUploader end

Si es así, debería poder llamar:

@page.form.url @page.form.filename

¿Estás seguro de que has subido / adjuntado el archivo correctamente? ¿Qué ves cuando inspeccionas @ page.form? Recuerde, el archivo adjunto no se guardará hasta que haya procesado completamente la carga.


Tienes razón @epylinkn. La documentación apunta a usar:

@page.form.file.identifier

Pero cuando uso eso, siempre obtengo nil (tal como comentó @Cheng).

Luego inspeccioné los métodos de mis objetos ( @page.form.file.methods.inspect ) y encontré lo siguiente para trabajar:

@page.form.file_identifier


CarrierWave::SanitizedFile tiene un método CarrierWave::SanitizedFile privado que contiene el nombre de archivo del archivo cargado. (documentos: http://rdoc.info/github/jnicklas/carrierwave/master/CarrierWave/SanitizedFile:original_filename )

Después de leer este hilo de la lista de correo de CarrierWave , ninguno parecía satisfacer mis necesidades. Con algo así como

class Upload < ActiveRecord::Base mount_uploader :file, FileUploader # ...

Modifico en gran medida el valor de la columna :file del nombre de archivo original. Debido a esto, decidí seguir el nombre del archivo original en una columna separada de la que está vinculada a CarrierWave. En mi FileUploader simplemente agregué un lector que ajusta el método private original_filename :

def original_file original_filename end

Luego agregué un evento before_create a la clase Upload (mis registros de before_create nunca se modifican, por lo que un before_create es aceptable para mis necesidades)

before_create do self.original_file = self.file.original_file end