Spec-Zone.ru › Ruby on Rails 7.1

класс ActiveStorage::Variant

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

Модификация Active Storage

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

Варианты полагаются на 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 60
def initialize(blob, variation_or_variation_key)
  @blob, @variation = blob, ActiveStorage::Variation.wrap(variation_or_variation_key)
end

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

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

Удаляет файл варианта из службы.

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

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

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

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

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

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

processed() Показать исходный код
# File activestorage/app/models/active_storage/variant.rb, line 65
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 80
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