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