Spec-Zone.ru › Ruby on Rails 7.2

класс ActiveStorage::Variant

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

Вариант Active Storage

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

Варианты полагаются на драгоценный камень 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

Обратите внимание, что для создания варианта необходимо загрузить весь файл 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 (например, 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 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

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

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 варианта 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