Class: ActiveStorage::Variation

Inherits:
Object
  • Object
show all
Defined in:
app/models/active_storage/variation.rb

Overview

A set of transformations that can be applied to a blob to create a variant. This class is exposed via the ActiveStorage::Blob#variant method and should rarely be used directly.

In case you do need to use this directly, it's instantiated using a hash of transformations where the key is the command and the value is the arguments. Example:

ActiveStorage::Variation.new(resize: "100x100", monochrome: true, trim: true, rotate: "-90")

You can also combine multiple transformations in one step, e.g. for center-weighted cropping:

ActiveStorage::Variation.new(combine_options: {
  resize: "100x100^",
  gravity: "center",
  crop: "100x100+0+0",
})

A list of all possible transformations is available at www.imagemagick.org/script/mogrify.php.

Defined Under Namespace

Classes: UnsupportedImageProcessingArgument, UnsupportedImageProcessingMethod

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(transformations) ⇒ Variation

Returns a new instance of Variation.



53
54
55
# File 'app/models/active_storage/variation.rb', line 53

def initialize(transformations)
  @transformations = transformations
end

Instance Attribute Details

#transformationsObject (readonly)

Returns the value of attribute transformations.



21
22
23
# File 'app/models/active_storage/variation.rb', line 21

def transformations
  @transformations
end

Class Method Details

.decode(key) ⇒ Object

Returns a Variation instance with the transformations that were encoded by encode.



42
43
44
# File 'app/models/active_storage/variation.rb', line 42

def decode(key)
  new ActiveStorage.verifier.verify(key, purpose: :variation)
end

.encode(transformations) ⇒ Object

Returns a signed key for the transformations, which can be used to refer to a specific variation in a URL or combined key (like ActiveStorage::Variant#key).



48
49
50
# File 'app/models/active_storage/variation.rb', line 48

def encode(transformations)
  ActiveStorage.verifier.generate(transformations, purpose: :variation)
end

.wrap(variator) ⇒ Object

Returns a Variation instance based on the given variator. If the variator is a Variation, it is returned unmodified. If it is a String, it is passed to ActiveStorage::Variation.decode. Otherwise, it is assumed to be a transformations Hash and is passed directly to the constructor.



30
31
32
33
34
35
36
37
38
39
# File 'app/models/active_storage/variation.rb', line 30

def wrap(variator)
  case variator
  when self
    variator
  when String
    decode variator
  else
    new variator
  end
end

Instance Method Details

#keyObject

Returns a signed key for all the transformations that this variation was instantiated with.



79
80
81
# File 'app/models/active_storage/variation.rb', line 79

def key
  self.class.encode(transformations)
end

#transform(image) ⇒ Object

Accepts an open MiniMagick image instance, like what's returned by MiniMagick::Image.read(io), and performs the transformations against it. The transformed image instance is then returned.



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'app/models/active_storage/variation.rb', line 59

def transform(image)
  ActiveSupport::Notifications.instrument("transform.active_storage") do
    transformations.each do |name, argument_or_subtransformations|
      validate_transformation(name, argument_or_subtransformations)
      image.mogrify do |command|
        if name.to_s == "combine_options"
          argument_or_subtransformations.each do |subtransformation_name, subtransformation_argument|
            validate_transformation(subtransformation_name, subtransformation_argument)
            pass_transform_argument(command, subtransformation_name, subtransformation_argument)
          end
        else
          validate_transformation(name, argument_or_subtransformations)
          pass_transform_argument(command, name, argument_or_subtransformations)
        end
      end
    end
  end
end