diff options
author | George Claghorn <george@basecamp.com> | 2017-12-15 10:45:00 -0500 |
---|---|---|
committer | George Claghorn <george@basecamp.com> | 2017-12-15 10:45:00 -0500 |
commit | 311af752cfd98b534a3d5dbf30e4a202693f32dc (patch) | |
tree | 16a88bee1a4ea197bc61bdcb449acd28f1b82b3e /activestorage/app/models/active_storage | |
parent | 3ddb811acc75292776c39f5a95840b21b32d9fd8 (diff) | |
download | rails-311af752cfd98b534a3d5dbf30e4a202693f32dc.tar.gz rails-311af752cfd98b534a3d5dbf30e4a202693f32dc.tar.bz2 rails-311af752cfd98b534a3d5dbf30e4a202693f32dc.zip |
Restrict variants to variable image blobs
Diffstat (limited to 'activestorage/app/models/active_storage')
-rw-r--r-- | activestorage/app/models/active_storage/blob.rb | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/activestorage/app/models/active_storage/blob.rb b/activestorage/app/models/active_storage/blob.rb index acaf22fac1..fdf17ac67e 100644 --- a/activestorage/app/models/active_storage/blob.rb +++ b/activestorage/app/models/active_storage/blob.rb @@ -16,6 +16,7 @@ require "active_storage/analyzer/null_analyzer" # update a blob's metadata on a subsequent pass, but you should not update the key or change the uploaded file. # If you need to create a derivative or otherwise change the blob, simply create a new blob and purge the old one. class ActiveStorage::Blob < ActiveRecord::Base + class InvariableError < StandardError; end class UnpreviewableError < StandardError; end class UnrepresentableError < StandardError; end @@ -110,6 +111,7 @@ class ActiveStorage::Blob < ActiveRecord::Base content_type.start_with?("text") end + # Returns an ActiveStorage::Variant instance with the set of +transformations+ provided. This is only relevant for image # files, and it allows any image to be transformed for size, colors, and the like. Example: # @@ -125,8 +127,20 @@ class ActiveStorage::Blob < ActiveRecord::Base # # This will create a URL for that specific blob with that specific variant, which the ActiveStorage::VariantsController # can then produce on-demand. + # + # Raises ActiveStorage::Blob::InvariableError if ImageMagick cannot transform the blob. To determine whether a blob is + # variable, call ActiveStorage::Blob#previewable?. def variant(transformations) - ActiveStorage::Variant.new(self, ActiveStorage::Variation.wrap(transformations)) + if variable? + ActiveStorage::Variant.new(self, ActiveStorage::Variation.wrap(transformations)) + else + raise InvariableError + end + end + + # Returns true if ImageMagick can transform the blob (its content type is in +ActiveStorage.variable_content_types+). + def variable? + ActiveStorage.variable_content_types.include?(content_type) end @@ -170,16 +184,16 @@ class ActiveStorage::Blob < ActiveRecord::Base case when previewable? preview transformations - when image? + when variable? variant transformations else raise UnrepresentableError end end - # Returns true if the blob is an image or is previewable. + # Returns true if the blob is variable or is previewable. def representable? - image? || previewable? + variable? || previewable? end |