Spec-Zone.ru › Ruby on Rails 7.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.url

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

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

avatar.variant(resize_to_limit: [800, 800], colourspace: "b-w", rotate: "-90")

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

  • ImageProcessing::MiniMagick

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

  • ImageProcessing::Vips

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

Атрибуты

blob[R]
variation[R]

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

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

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

download(&block) Показать исходный код
# File activestorage/app/models/active_storage/variant.rb, line 84
def download(&block)
  service.download key, &block
end

Загружает файл, связанный с этим вариантом. Если блок не задан, весь файл читается в память и возвращается. Это потребует много оперативной памяти для очень больших файлов. Если блок задан, то загрузка передаётся потоком и выводится кусками.

filename() Показать исходный код
# File activestorage/app/models/active_storage/variant.rb, line 88
def filename
  ActiveStorage::Filename.new "#{blob.filename.base}.#{variation.format.downcase}"
end
image() Показать исходный код
# File activestorage/app/models/active_storage/variant.rb, line 99
def image
  self
end

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

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

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

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

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

url(expires_in: ActiveStorage.service_urls_expire_in, disposition: :inline) Показать исходный код
# File activestorage/app/models/active_storage/variant.rb, line 78
def 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 варианта BLOB в сервисе. Подробности см. в {ActiveStorage::Blob#url}.

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

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

Spec-Zone.ru

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