Spec-Zone.ru › Ruby on Rails 8.0

class ActiveStorage::Variant

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

Active Storage Variant

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

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

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

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

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

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

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

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

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

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

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

Вы можете комбинировать любое количество операций ImageMagick/libvips в варианте, а также любые макросы, предоставляемые драгоценным камнем ImageProcessing (такие как 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[Ч]
variation[Ч]

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

new(blob, variation_or_variation_key) Показать исходный код
# File activestorage/app/models/active_storage/variant.rb, line 62
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 102
def destroy
  service.delete(key)
end

Удаляет файл варианта с сервиса.

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

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

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

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

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

Возвращает комбинированный ключ блока и варианта, который вместе определяет конкретный вариант.

processed() Показать исходный код
# File activestorage/app/models/active_storage/variant.rb, line 67
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 82
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 варианта блока на сервисе. Подробности см. в {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