класс 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:
Атрибуты
Публичные методы класса
# 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
Публичные методы экземпляра
# File activestorage/app/models/active_storage/variant.rb, line 84 def download(&block) service.download key, &block end
Загружает файл, связанный с этим вариантом. Если блок не задан, весь файл читается в память и возвращается. Это потребует много оперативной памяти для очень больших файлов. Если блок задан, то загрузка передаётся потоком и выводится кусками.
# File activestorage/app/models/active_storage/variant.rb, line 88
def filename
ActiveStorage::Filename.new "#{blob.filename.base}.#{variation.format.downcase}"
end # File activestorage/app/models/active_storage/variant.rb, line 99 def image self end
Возвращает получаемый вариант. Разрешает использование экземпляров ActiveStorage::Variant и ActiveStorage::Preview взаимозаменяемо.
# File activestorage/app/models/active_storage/variant.rb, line 69
def key
"variants/#{blob.key}/#{OpenSSL::Digest::SHA256.hexdigest(variation.key)}"
end Возвращает комбинированный ключ BLOB и варианта, которые вместе идентифицируют конкретный вариант.
# File activestorage/app/models/active_storage/variant.rb, line 63 def processed process unless processed? self end
Возвращает сам экземпляр варианта после его обработки или обнаружения существующей обработки в сервисе.
# 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.