Afficher un nom de fichier Carrierwave dans la vue

J’essaie d’afficher le nom de fichier d’une pièce jointe Carrierwave dans un modèle erb Rails. Ce qui suit ne fonctionne pas:

 

Cela semble conforme à la documentation . Une étape supplémentaire est-elle nécessaire?

Mon modèle de page ressemble à ceci:

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

Le téléchargeur de formulaire ressemble à ceci:

 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 

La documentation que vous consultez est le fichier assaini, c’est ce qu’il utilise pour stocker un fichier. La partie que vous recherchez est FormUploader, qui est un Uploader, et une partie de http://rubydoc.info/gems/carrierwave/0.5.2/CarrierWave/Uploader

Si vous souhaitez obtenir le nom du fichier, vous pouvez le lire directement dans la colonne de la firebase database ou utiliser File.basename(@page.form.path) pour l’extraire facilement.

J’ai pu obtenir le nom du fichier via le paramètre interne du file :

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

Les documents de Carrierwave sont peut-être un peu décalés, mais la méthode recommandée semble être:

 @page.form.file.identifier 

La solution de @ adamonduty est géniale. Une autre solution que j’ai utilisée auparavant, crée simplement une méthode sur le modèle:

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

Tu as raison @epylinkn. La documentation pointe vers l’utilisation de:

 @page.form.file.identifier 

Mais quand je l’utilise, j’obtiens toujours nil (comme l’a commenté @Cheng).

J’ai ensuite inspecté mes méthodes d’objects ( @page.form.file.methods.inspect ) et @page.form.file.methods.inspect trouvé ce qui suit pour fonctionner:

 @page.form.file_identifier 

Si vous utilisez ActiveRecord, vous pouvez accéder directement au champ nommé form de deux manières:

 def my_method self[:form] end 

ou

 def my_method form_before_type_cast end 

La seconde méthode est en lecture seule.

Je suppose que vous avez des modèles comme ça?

 class Page mount_uploader :form, FormUploader end 

Si oui, vous devriez pouvoir appeler:

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

Êtes-vous sûr d’avoir téléchargé / joint le fichier correctement? Que voyez-vous lorsque vous inspectez @ page.form? N’oubliez pas que la pièce jointe ne sera pas enregistrée tant que vous n’avez pas entièrement traité le téléchargement.

Dans la classe d’uploader associée à votre modèle, définissez une méthode de nom de fichier.

 def filename File.basename(path) end 

Vous pouvez alors appeler

 model_instance.file.filename 

Fonctionne à partir de CarrierWave 1.1.0. Il s’agit d’une reformulation / fusion succincte des réponses de kikito et Chris Alley ci-dessus.

CarrierWave::SanitizedFile a une méthode privée original_filename contenant le nom du fichier téléchargé. (docs: http://rdoc.info/github/jnicklas/carrierwave/master/CarrierWave/SanitizedFile:original_filename )

Après avoir lu ce fil de la liste de diffusion CarrierWave , aucun ne semblait répondre à mes besoins. Avec quelque chose comme

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

Je modifie fortement la valeur de la colonne :file du nom de fichier d'origine. Pour cette raison, j'ai décidé de suivre le nom du fichier d'origine dans une colonne distincte de celle liée à CarrierWave. Dans mon FileUploader j'ai simplement ajouté un lecteur qui encapsule la méthode privée original_filename :

 def original_file original_filename end 

J'ai ensuite ajouté un événement before_create à la classe Upload (mes enregistrements Upload ne sont jamais modifiés, donc un before_create est acceptable pour mes besoins)

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

Ceci est ma solution:

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