модуль ActiveStorage::Blob::Representable
Открытые методы экземпляра
# File activestorage/app/models/active_storage/blob/representable.rb, line 129
def preview(transformations)
if previewable?
ActiveStorage::Preview.new(self, transformations)
else
raise ActiveStorage::UnpreviewableError, "No previewer found for blob with ID=#{id} and content_type=#{content_type}"
end
end Возвращает экземпляр ActiveStorage::Preview с указанным набором transformations. Предварительный просмотр — это изображение, созданное из блоба, не являющегося изображением. Active Storage включает встроенные средства предварительного просмотра для видео и документов PDF. Средство предварительного просмотра видео извлекает первый кадр из видео, а средство для PDF — первую страницу документа PDF.
blob.preview(resize_to_limit: [100, 100]).processed.url
Не обрабатывайте предварительные просмотры синхронно в представлениях. Вместо этого создайте ссылку на действие контроллера, которое обрабатывает их по запросу. Active Storage предоставляет такое действие, но вы можете создать собственное (например, если требуется аутентификация). Вот как использовать встроенный вариант:
<%= image_tag video.preview(resize_to_limit: [100, 100]) %>
Этот метод вызывает исключение ActiveStorage::UnpreviewableError, если ни одно средство предварительного просмотра не может обработать переданный блоб. Чтобы определить, поддерживается ли блоб каким-либо средством предварительного просмотра, вызовите ActiveStorage::Blob#previewable?.
# File activestorage/app/models/active_storage/blob/representable.rb, line 138
def previewable?
ActiveStorage.previewers.any? { |klass| klass.accept?(self) }
end Возвращает true, если зарегистрированное средство предварительного просмотра может обработать блоб. По умолчанию метод возвращает true для видео и документов PDF.
# File activestorage/app/models/active_storage/blob/representable.rb, line 163 def representable? variable? || previewable? end
Возвращает true, если блоб можно преобразовать или для него доступен предварительный просмотр.
# File activestorage/app/models/active_storage/blob/representable.rb, line 151
def representation(transformations)
case
when previewable?
preview transformations
when variable?
variant transformations
else
raise ActiveStorage::UnrepresentableError, "No previewer found and can't transform blob with ID=#{id} and content_type=#{content_type}"
end
end Возвращает ActiveStorage::Preview для блоба, поддерживающего предварительный просмотр, или ActiveStorage::Variant для изменяемого блоба-изображения.
blob.representation(resize_to_limit: [100, 100]).processed.url
Вызывает исключение ActiveStorage::UnrepresentableError, если переданный блоб нельзя преобразовать и для него недоступен предварительный просмотр. Вызовите ActiveStorage::Blob#representable?, чтобы определить, можно ли преобразовать блоб.
Дополнительные сведения см. в описаниях ActiveStorage::Blob#preview и ActiveStorage::Blob#variant.
# File activestorage/app/models/active_storage/blob/representable.rb, line 110 def variable? ActiveStorage.variable_content_types.include?(content_type) end
Возвращает true, если процессор вариантов может преобразовать блоб (его тип содержимого входит в ActiveStorage.variable_content_types).
# File activestorage/app/models/active_storage/blob/representable.rb, line 100
def variant(transformations)
if variable?
variant_class.new(self, ActiveStorage::Variation.wrap(transformations).default_to(default_variant_transformations))
else
raise ActiveStorage::InvariableError, "Can't transform blob with ID=#{id} and content_type=#{content_type}"
end
end Возвращает экземпляр ActiveStorage::Variant или ActiveStorage::VariantWithRecord с указанным набором transformations. Это актуально только для файлов изображений и позволяет преобразовывать любое изображение, изменяя размер, цвета и другие параметры. Пример:
avatar.variant(resize_to_limit: [100, 100]).processed.url
Этот код создаст и обработает вариант блоба аватара, ограниченный высотой и шириной в 100px. Затем он загрузит этот вариант в хранилище, используя ключ, производный от блоба и преобразований.
Однако часто вам не нужно сразу преобразовывать вариант. Вместо этого достаточно указать конкретный вариант, который контроллер может создать по запросу. Например:
<%= image_tag Current.user.avatar.variant(resize_to_limit: [100, 100]) %>
Этот код создаст URL для конкретного блоба с указанным вариантом, который затем может быть сформирован по запросу контроллером ActiveStorage::Representations::ProxyController или ActiveStorage::Representations::RedirectController.
Вызывает исключение ActiveStorage::InvariableError, если процессор вариантов не может преобразовать блоб. Чтобы определить, можно ли преобразовать блоб, вызовите ActiveStorage::Blob#variable?.
Параметры
Параметры определяются гемом image_processing и зависят от используемого процессора вариантов: Vips или MiniMagick. Однако оба процессора вариантов поддерживают следующие параметры:
:resize_to_limit-
Уменьшает изображение так, чтобы оно поместилось в указанные размеры, сохраняя исходное соотношение сторон. Изображение будет изменено только в том случае, если оно больше указанных размеров.
user.avatar.variant(resize_to_limit: [100, 100])
:resize_to_fit-
Изменяет размер изображения так, чтобы оно поместилось в указанные размеры, сохраняя исходное соотношение сторон. Изображение будет уменьшено, если оно больше указанных размеров, или увеличено, если оно меньше.
user.avatar.variant(resize_to_fit: [100, 100])
:resize_to_fill-
Изменяет размер изображения так, чтобы оно заполнило указанные размеры, сохраняя исходное соотношение сторон. При необходимости изображение будет обрезано по большей стороне.
user.avatar.variant(resize_to_fill: [100, 100])
:resize_and_pad-
Изменяет размер изображения так, чтобы оно поместилось в указанные размеры, сохраняя исходное соотношение сторон. При необходимости оставшаяся область будет заполнена прозрачным цветом, если исходное изображение имеет альфа-канал, или черным цветом в противном случае.
user.avatar.variant(resize_and_pad: [100, 100])
:crop-
Извлекает область из изображения. Первые два аргумента задают левую и верхнюю границы извлекаемой области, а последние два — ее ширину и высоту.
user.avatar.variant(crop: [20, 50, 300, 300])
:rotate-
Поворачивает изображение на указанный угол.
user.avatar.variant(rotate: 90)
Некоторые параметры, в том числе перечисленные выше, могут принимать дополнительные значения, специфичные для процессора; их можно передать в завершающем хеше:
<!-- Vips supports configuring `crop` for many of its transformations -->
<%= image_tag user.avatar.variant(resize_to_fill: [100, 100, { crop: :centre }]) %> При переносе существующего приложения с MiniMagick на Vips или наоборот необходимо обновить параметры, специфичные для процессора:
<!-- MiniMagick -->
<%= image_tag user.avatar.variant(resize_to_limit: [100, 100], format: :jpeg,
sampling_factor: "4:2:0", strip: true, interlace: "JPEG", colorspace: "sRGB", quality: 80) %>
<!-- Vips -->
<%= image_tag user.avatar.variant(resize_to_limit: [100, 100], format: :jpeg,
saver: { subsample_mode: "on", strip: true, interlace: true, quality: 80 }) %>
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.