Spec-Zone.ru › Ruby on Rails 6.0

класс ActiveStorage::Variant

Родитель:
Объект

Изображения могут иметь варианты, которые являются результатом набора преобразований, применённых к оригинальному изображению. Эти варианты используются для создания миниатюр, изображений с фиксированным размером или любых других производных изображений из оригинала.

Варианты полагаются на ImageProcessing gem для фактических преобразований файла, поэтому вы должны добавить gem "image_processing" в свой Gemfile, если хотите использовать варианты. По умолчанию изображения будут обрабатываться с помощью ImageMagick с использованием MiniMagick gem, но вы также можете переключиться на процессор libvips, управляемый ruby-vips gem.

Rails.application.config.active_storage.variant_processor
# => :mini_magick

Rails.application.config.active_storage.variant_processor = :vips
# => :vips

Обратите внимание, что для создания варианта необходимо загрузить весь файл BLOB из сервиса. Из-за этого процесса важно учитывать, когда вариант фактически обрабатывается. Например, вы не должны обрабатывать варианты непосредственно в шаблоне. Отложите обработку до контроллера по требованию, как тот, что предоставляется в ActiveStorage::RepresentationsController.

Для ссылки на такой отложенный вариант по требованию просто ссылайтесь на вариант через резолвируемый маршрут, предоставленный Active Storage, как показано ниже:

<%= image_tag Current.user.avatar.variant(resize_to_limit: [100, 100]) %>

Это создаст URL для этого конкретного BLOB с этим конкретным вариантом, который ActiveStorage::RepresentationsController затем может произвести по запросу.

Когда вам нужно фактически создать необходимый вариант, вызовите processed. Это проверит, был ли вариант уже обработан и загружен в сервис, и, если это так, просто вернёт его. В противном случае он выполнит преобразования, загрузит вариант в сервис и вернёт себя снова. Пример:

avatar.variant(resize_to_limit: [100, 100]).processed.service_url

Это создаст и обработает вариант изображения аватара, ограниченного высотой и шириной 100. Затем он загрузит этот вариант в сервис в соответствии с ключом производного объекта BLOB и преобразованиями.

Вы можете объединить любое количество операций ImageMagick/libvips в один вариант, а также любые макросы, предоставленные ImageProcessing gem (например, resize_to_limit):

avatar.variant(resize_to_limit: [800, 800], monochrome: true, rotate: "-90")

Посетите следующие ссылки для получения списка доступных команд ImageProcessing и операций ImageMagick/libvips:

  • ImageProcessing::MiniMagick

  • Справочник по ImageMagick

  • ImageProcessing::Vips

  • Справочник по ruby-vips

Константы

WEB_IMAGE_CONTENT_TYPES

Атрибуты

blob[R]
variation[R]

Публичные методы класса

new(blob, variation_or_variation_key) Показать исходный код
# File activestorage/app/models/active_storage/variant.rb, line 61
def initialize(blob, variation_or_variation_key)
  @blob, @variation = blob, ActiveStorage::Variation.wrap(variation_or_variation_key)
end

Публичные методы экземпляра

image() Показать исходный код
# File activestorage/app/models/active_storage/variant.rb, line 89
def image
  self
end

Возвращает получаемый вариант. Позволяет использовать экземпляры ActiveStorage::Variant и ActiveStorage::Preview взаимозаменяемо.

key() Показать исходный код
# File activestorage/app/models/active_storage/variant.rb, line 72
def key
  "variants/#{blob.key}/#{Digest::SHA256.hexdigest(variation.key)}"
end

Возвращает комбинированный ключ BLOB и варианта, которые вместе идентифицируют конкретный вариант.

processed() Показать исходный код
# File activestorage/app/models/active_storage/variant.rb, line 66
def processed
  process unless processed?
  self
end

Возвращает экземпляр варианта после его обработки или найденной обработки на сервисе.

service_url(expires_in: ActiveStorage.service_urls_expire_in, disposition: :inline) Показать исходный код
# File activestorage/app/models/active_storage/variant.rb, line 84
def service_url(expires_in: ActiveStorage.service_urls_expire_in, disposition: :inline)
  service.url key, expires_in: expires_in, disposition: disposition, filename: filename, content_type: content_type
end

Возвращает URL варианта на сервисе. Этот URL предназначен для кратковременного использования в целях безопасности и не должен использоваться напрямую с пользователями. Вместо этого service_url должен быть показан только как переадресация с устойчивого, возможно аутентифицированного URL. Скрытие service_url за переадресацией также даёт вам возможность изменять сервисы без обновления всех URL. И это позволяет кэшировать постоянные URL, которые переадресуют на service_url в представлении.

Используйте url_for(variant) (или подразумеваемую форму, например, +link_to variant+ или +redirect_to variant+), чтобы получить устойчивый URL для варианта, указывающий на ActiveStorage::RepresentationsController, который в свою очередь будет использовать этот service_call метод для своей переадресации.

© 2004–2019 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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