класс 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], monochrome: true, 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 87 def download(&block) service.download key, &block end
Загружает файл, связанный с этим вариантом. Если блок не задан, весь файл считывается в память и возвращается. Это использует много оперативной памяти для очень больших файлов. Если блок задан, загрузка происходит потоком и выводится частями.
# File activestorage/app/models/active_storage/variant.rb, line 91
def filename
ActiveStorage::Filename.new "#{blob.filename.base}.#{variation.format}"
end # File activestorage/app/models/active_storage/variant.rb, line 102 def image self end
Возвращает получаемый вариант. Позволяет использовать экземпляры ActiveStorage::Variant и ActiveStorage::Preview взаимозаменяемо.
# File activestorage/app/models/active_storage/variant.rb, line 69
def key
"variants/#{blob.key}/#{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–2020 David Heinemeier Hansson
Licensed under the MIT License.