Отображение имени носителя Carrierwave в представлении

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

<%= @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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

@page.form.file.identifier

Ответ 4

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

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

Ответ 5

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

@page.form.file.identifier

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

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

@page.form.file_identifier

Ответ 6

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

def my_method
  self[:form]
end

или

def my_method
  form_before_type_cast
end

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

Ответ 7

Я предполагаю, что у вас есть такие модели?

class Page
  mount_uploader :form, FormUploader
end

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

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

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

Ответ 8

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

def filename
  File.basename(path)
end

Затем вы можете вызвать

model_instance.file.filename

Работает с CarrierWave 1.1.0. Это краткое повторение/слияние ответов kikito и Chris Alley выше.

Ответ 9

CarrierWave::SanitizedFile имеет частный original_filename метод, содержащий имя файла загруженного файла. (docs: 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

Ответ 10

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

  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