Отображение имени носителя 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