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