Module: ActiveStorage::Blob::Representable
- Extended by:
- ActiveSupport::Concern
- Included in:
- ActiveStorage::Blob
- Defined in:
- app/models/active_storage/blob/representable.rb
Instance Method Summary collapse
-
#create_preview_image_later(variations) ⇒ Object
:nodoc:.
-
#preprocessed(transformations) ⇒ Object
:nodoc:.
-
#preview(transformations) ⇒ Object
Returns an ActiveStorage::Preview instance with the set of
transformations
provided. -
#preview_image_needed_before_processing_variants? ⇒ Boolean
:nodoc:.
-
#previewable? ⇒ Boolean
Returns true if any registered previewer accepts the blob.
-
#representable? ⇒ Boolean
Returns true if the blob is variable or previewable.
-
#representation(transformations) ⇒ Object
Returns an ActiveStorage::Preview for a previewable blob or an ActiveStorage::Variant for a variable image blob.
-
#variable? ⇒ Boolean
Returns true if the variant processor can transform the blob (its content type is in
ActiveStorage.variable_content_types
). -
#variant(transformations) ⇒ Object
Returns an ActiveStorage::Variant or ActiveStorage::VariantWithRecord instance with the set of
transformations
provided.
Instance Method Details
#create_preview_image_later(variations) ⇒ Object
:nodoc:
105 106 107 |
# File 'app/models/active_storage/blob/representable.rb', line 105 def create_preview_image_later(variations) # :nodoc: ActiveStorage::PreviewImageJob.perform_later(self, variations) if representable? end |
#preprocessed(transformations) ⇒ Object
:nodoc:
109 110 111 |
# File 'app/models/active_storage/blob/representable.rb', line 109 def preprocessed(transformations) # :nodoc: ActiveStorage::TransformJob.perform_later(self, transformations) if representable? end |
#preview(transformations) ⇒ Object
Returns an ActiveStorage::Preview instance with the set of transformations
provided. A preview is an image generated from a non-image blob. Active Storage comes with built-in previewers for videos and PDF documents. The video previewer extracts the first frame from a video and the PDF previewer extracts the first page from a PDF document.
blob.preview(resize_to_limit: [100, 100]).processed.url
Avoid processing previews synchronously in views. Instead, link to a controller action that processes them on demand. Active Storage provides one, but you may want to create your own (for example, if you need authentication). Here’s how to use the built-in version:
<%= image_tag video.preview(resize_to_limit: [100, 100]) %>
This method raises ActiveStorage::UnpreviewableError if no previewer accepts the receiving blob. To determine whether a blob is accepted by any previewer, call ActiveStorage::Blob#previewable?.
63 64 65 66 67 68 69 |
# File 'app/models/active_storage/blob/representable.rb', line 63 def preview(transformations) if previewable? ActiveStorage::Preview.new(self, transformations) else raise ActiveStorage::UnpreviewableError, "No previewer found for blob with ID=#{id} and content_type=#{content_type}" end end |
#preview_image_needed_before_processing_variants? ⇒ Boolean
:nodoc:
101 102 103 |
# File 'app/models/active_storage/blob/representable.rb', line 101 def preview_image_needed_before_processing_variants? # :nodoc: previewable? && !preview_image.attached? end |
#previewable? ⇒ Boolean
Returns true if any registered previewer accepts the blob. By default, this will return true for videos and PDF documents.
72 73 74 |
# File 'app/models/active_storage/blob/representable.rb', line 72 def previewable? ActiveStorage.previewers.any? { |klass| klass.accept?(self) } end |
#representable? ⇒ Boolean
Returns true if the blob is variable or previewable.
97 98 99 |
# File 'app/models/active_storage/blob/representable.rb', line 97 def representable? variable? || previewable? end |
#representation(transformations) ⇒ Object
Returns an ActiveStorage::Preview for a previewable blob or an ActiveStorage::Variant for a variable image blob.
blob.representation(resize_to_limit: [100, 100]).processed.url
Raises ActiveStorage::UnrepresentableError if the receiving blob is neither variable nor previewable. Call ActiveStorage::Blob#representable? to determine whether a blob is representable.
See ActiveStorage::Blob#preview and ActiveStorage::Blob#variant for more information.
85 86 87 88 89 90 91 92 93 94 |
# File 'app/models/active_storage/blob/representable.rb', line 85 def representation(transformations) case when previewable? preview transformations when variable? variant transformations else raise ActiveStorage::UnrepresentableError, "No previewer found and can't transform blob with ID=#{id} and content_type=#{content_type}" end end |
#variable? ⇒ Boolean
Returns true if the variant processor can transform the blob (its content type is in ActiveStorage.variable_content_types
).
44 45 46 |
# File 'app/models/active_storage/blob/representable.rb', line 44 def variable? ActiveStorage.variable_content_types.include?(content_type) end |
#variant(transformations) ⇒ Object
Returns an ActiveStorage::Variant or ActiveStorage::VariantWithRecord 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:
avatar.variant(resize_to_limit: [100, 100]).processed.url
This will create and process a variant of the avatar blob that’s constrained to a height and width of 100px. Then it’ll upload said variant to the service according to a derivative key of the blob and the transformations.
Frequently, though, you don’t actually want to transform the variant right away. But rather simply refer to a specific variant that can be created by a controller on-demand. Like so:
<%= image_tag Current.user.avatar.variant(resize_to_limit: [100, 100]) %>
This will create a URL for that specific blob with that specific variant, which the ActiveStorage::RepresentationsController can then produce on-demand.
Raises ActiveStorage::InvariableError if the variant processor cannot transform the blob. To determine whether a blob is variable, call ActiveStorage::Blob#variable?.
34 35 36 37 38 39 40 |
# File 'app/models/active_storage/blob/representable.rb', line 34 def variant(transformations) if variable? variant_class.new(self, ActiveStorage::Variation.wrap(transformations).default_to(default_variant_transformations)) else raise ActiveStorage::InvariableError, "Can't transform blob with ID=#{id} and content_type=#{content_type}" end end |