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