Ответ 1
Я действительно реализовал эту самую функцию. Paperclip создает эскизы для всех моих изображений и PDF файлов, и я добавил пользовательские значки миниатюр для файлов MS Word, Excel, HTML, TXT и т.д.
Мое решение довольно просто. В моей модели Attachment
(в вашем случае Asset
) я определил следующий метод:
def thumbnail_uri(style = :original)
if style == :original || has_thumbnail?
attachment.s3.interface.get_link(attachment.s3_bucket.to_s, attachment.path(style), EXPIRES_AFTER)
else
generic_icon_path style
end
end
Это возвращает либо URL-адрес миниатюры, хранящейся на S3, либо локальный путь к универсальному значку PNG, основанному на типе содержимого активов (см. ниже). Метод has_thumbnail?
определяет, генерировал ли этот актив эскиз для него. Это то, что я добавил в своей собственной вилке Paperclip, но вы можете подставить свою логику (я не уверен в "стандартном" способе определить это, возможно, сравнивая путь с вашим определенным "отсутствующим" путем или даже просто сравнивая тип контента со списком по умолчанию [ "image/jpeg", "image/png" ] и т.д.).
В любом случае, здесь метод, который возвращает путь к общему значку на основе стиля миниатюр (в вашем случае: большой и большой) и типа содержимого:
# Generates a path to the thumbnail image for the given content type
# and image size.
#
# e.g. a :small thumbnail with a content type of text/html, the file name
# would have the filename icon.small.text.html.png
#
# If no such thumbnail can be found a generic one is returned
def generic_icon_path(style = image.default_style)
url = "/images/attachments/icon.#{style.to_s}.#{attachment_content_type.sub('/', '.')}.png"
if File.exists? "#{RAILS_ROOT}/public/#{url}"
url
else
"/images/attachments/icon.#{style.to_s}.default.png"
end
end
Затем, чтобы добавить новый миниатюру, я просто добавляю PNG файлы в /images/attachments/
с правильным соглашением имени файла. Мой стиль миниатюры называется: маленький, и я определил стили для Word, Excel и обычного текста, поэтому в настоящее время у меня есть:
icon.small.application.msword.png
icon.small.text.plain.png
icon.small.application.vnd.ms-excel.png
icon.small.application.vnd.openxmlformats-officedocument.spreadsheetml.sheet.png
icon.small.application.vnd.openxmlformats-officedocument.wordprocessingml.document.png
Если тип содержимого не поддерживается, отображается общий значок "catch all":
icon.small.default.png