Spec-Zone.ru › Ruby on Rails 8.1

модуль ActiveStorage::Blob::Representable

Открытые методы экземпляра

preview (transformations) Показать исходный код
# 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?.

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.

representable? () Показать исходный код
# File activestorage/app/models/active_storage/blob/representable.rb, line 163
def representable?
  variable? || previewable?
end

Возвращает true, если блоб можно преобразовать или для него доступен предварительный просмотр.

representation (transformations) Показать исходный код
# 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.

variable? () Показать исходный код
# 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).

variant (transformations) Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API