Отображение имени файла Carrierwave в представлении - PullRequest
49 голосов
/ 27 февраля 2011

Я пытаюсь отобразить имя файла вложения Carrierwave в шаблоне Rails erb.Следующее не работает:

<%= @page.form.filename %>

Это похоже на документацию .Нужен ли какой-то дополнительный шаг?

Моя модель страницы выглядит следующим образом:

class Page < ActiveRecord::Base

  mount_uploader :form, FormUploader

end

Загрузчик форм выглядит так:

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

Ответы [ 10 ]

80 голосов
/ 28 февраля 2011

Документация, которую вы просматриваете - это очищенный файл, это то, что он использует для фактического хранения файла.Часть, которую вы ищете, это FormUploader, который является Uploader, и часть http://rubydoc.info/gems/carrierwave/0.5.2/CarrierWave/Uploader

Если вы хотите получить имя файла, вы можете либо прочитать его непосредственно из столбца базы данных, либо использовать File.basename(@page.form.path) чтобы легко извлечь.

78 голосов
/ 07 мая 2012

Мне удалось получить имя файла с помощью внутреннего параметра file:

<%= @page.form.file.filename %>
14 голосов
/ 06 сентября 2013

Документы Carrierwave могут быть немного неактивными, но рекомендуемый способ выглядит так:

9 голосов
/ 02 июля 2012

@ Решение adamonduty великолепно. Другое решение, которое я использовал ранее, просто создайте метод на модели:

def name
  file.path.split("/").last
end
6 голосов
/ 18 июля 2014

Ты прав @epylinkn.Документация указывает на использование:

@page.form.file.identifier

Но когда я использую это, я всегда получаю nil (как прокомментировал @Cheng).

Затем я проверял свои методы объектов (@page.form.file.methods.inspect)) и нашел следующее для работы:

@page.form.file_identifier
4 голосов
/ 02 сентября 2017

В классе загрузчика вашей модели определите метод имени файла.

def filename
  File.basename(path)
end

Вы можете позвонить

model_instance.file.filename

Работает с CarrierWave 1.1.0. Это краткое изложение / объединение ответов Кикито и Криса Элли выше.

4 голосов
/ 17 марта 2012

Если вы используете ActiveRecord, вы можете напрямую получить доступ к полю с именем form двумя способами:

def my_method
  self[:form]
end

или

def my_method
  form_before_type_cast
end

Второй метод доступен только для чтения.

2 голосов
/ 27 февраля 2011

Полагаю, у вас есть такие модели?

class Page
  mount_uploader :form, FormUploader
end

Если это так, вы сможете позвонить:

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

Вы уверены, что вы загрузили / прикрепили файл правильно? Что вы видите, когда проверяете @ page.form? Помните, что вложение не будет сохранено, пока вы полностью не обработаете загрузку.

1 голос
/ 21 апреля 2013

Это мое решение:

  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
1 голос
/ 30 апреля 2011

CarrierWave::SanitizedFile имеет приватный метод original_filename, содержащий имя файла загруженного файла.(документы: http://rdoc.info/github/jnicklas/carrierwave/master/CarrierWave/SanitizedFile:original_filename)

После прочтения этой ветки из списка рассылки CarrierWave , похоже, ни одна из них не соответствует моим потребностям. С чем-то вроде

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

я сильноизмените значение столбца :file по сравнению с исходным именем файла. В связи с этим я решил отследить исходное имя файла в отдельном столбце от столбца, привязанного к CarrierWave. В моем FileUploader я просто добавил читатель, который упаковывает приватное original_filenameМетод:

def original_file
  original_filename
end

Затем я добавил событие before_create в класс Upload (мои записи Upload никогда не изменяются, поэтому before_create приемлемо для моих нужд)

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