Spec-Zone.ru › Ruby on Rails 8.1

class ActiveStorage::Variant

Родительский класс:
Object

Вариант Active Storage

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

Для преобразования файлов варианты используют гем ImageProcessing, поэтому, если вы хотите использовать варианты, необходимо добавить gem "image_processing" в Gemfile. По умолчанию изображения обрабатываются с помощью libvips и гема ruby-vips, но вы также можете переключиться на процессор ImageMagick, работающий с гемом MiniMagick).

Rails.application.config.active_storage.variant_processor
# => :vips

Rails.application.config.active_storage.variant_processor = :mini_magick
# => :mini_magick

Обратите внимание: для создания варианта необходимо загрузить с сервиса весь файл объекта. Поэтому следует внимательно выбирать момент обработки варианта. Например, не следует обрабатывать варианты непосредственно в шаблоне. Отложите обработку до момента запроса в контроллере, например, в контроллере из ActiveStorage::Representations::ProxyController или ActiveStorage::Representations::RedirectController.

Чтобы сослаться на такой отложенный вариант, просто создайте ссылку на вариант через маршрут, предоставляемый Active Storage, например:

<%= image_tag Current.user.avatar.variant(resize_to_limit: [100, 100]) %>

Это создаст URL для указанного файла объекта с указанным вариантом, который затем сможет создать по запросу ActiveStorage::Representations::ProxyController или ActiveStorage::Representations::RedirectController.

Когда потребуется создать нужный вариант, вызовите processed. Этот метод проверит, был ли вариант уже обработан и загружен на сервис, и, если да, просто вернёт его. В противном случае он выполнит преобразования, загрузит вариант на сервис и снова вернёт себя. Например:

avatar.variant(resize_to_limit: [100, 100]).processed.url

Этот код создаст и обработает вариант файла объекта аватара, ограниченный высотой и шириной в 100 пикселей. Затем он загрузит этот вариант на сервис, используя ключ производного файла объекта и преобразований.

Вариант может включать любое количество операций 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

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

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 варианта файла объекта на сервисе. Подробности см. в описании ActiveStorage::Blob#url.

Используйте url_for(variant) (или подразумеваемую форму, например link_to variant или redirect_to variant), чтобы получить постоянный URL варианта, ведущий к ActiveStorage::Representations::ProxyController или ActiveStorage::Representations::RedirectController, который, в свою очередь, использует этот метод service_call для перенаправления.

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API