module ActiveStorage::Blob::Representable

Public Instance Methods

preview(transformations) Show source
# File activestorage/app/models/active_storage/blob/representable.rb, line 56
def preview(transformations)
  if previewable?
    ActiveStorage::Preview.new(self, transformations)
  else
    raise ActiveStorage::UnpreviewableError
  end
end

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.service_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 #previewable?.

previewable?() Show source
# File activestorage/app/models/active_storage/blob/representable.rb, line 65
def previewable?
  ActiveStorage.previewers.any? { |klass| klass.accept?(self) }
end

Returns true if any registered previewer accepts the blob. By default, this will return true for videos and PDF documents.

representable?() Show source
# File activestorage/app/models/active_storage/blob/representable.rb, line 90
def representable?
  variable? || previewable?
end

Returns true if the blob is variable or previewable.

representation(transformations) Show source
# File activestorage/app/models/active_storage/blob/representable.rb, line 78
def representation(transformations)
  case
  when previewable?
    preview transformations
  when variable?
    variant transformations
  else
    raise ActiveStorage::UnrepresentableError
  end
end

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.service_url

Raises ActiveStorage::UnrepresentableError if the receiving blob is neither variable nor previewable. Call #representable? to determine whether a blob is representable.

See #preview and #variant for more information.

variable?() Show source
# File activestorage/app/models/active_storage/blob/representable.rb, line 37
def variable?
  ActiveStorage.variable_content_types.include?(content_type)
end

Returns true if ImageMagick can transform the blob (its content type is in ActiveStorage.variable_content_types).

variant(transformations) Show source
# File activestorage/app/models/active_storage/blob/representable.rb, line 28
def variant(transformations)
  if variable?
    ActiveStorage::Variant.new(self, transformations)
  else
    raise ActiveStorage::InvariableError
  end
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:

avatar.variant(resize_to_limit: [100, 100]).processed.service_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 ImageMagick cannot transform the blob. To determine whether a blob is variable, call #variable?.

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