123456789_123456789_123456789_123456789_123456789_

Class: ActiveStorage::Previewer

Relationships & Source Files
Namespace Children
Classes:
Extension / Inclusion / Inheritance Descendants
Subclasses:
Inherits: Object
Defined in: activestorage/lib/active_storage/previewer.rb

Overview

This is an abstract base class for previewers, which generate images from blobs. See MuPDFPreviewer and VideoPreviewer for examples of concrete subclasses.

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(blob) ⇒ Previewer

[ GitHub ]

  
# File 'activestorage/lib/active_storage/previewer.rb', line 16

def initialize(blob)
  @blob = blob
end

Class Method Details

.accept?(blob) ⇒ Boolean

Implement this method in a concrete subclass. Have it return true when given a blob from which the previewer can generate an image.

[ GitHub ]

  
# File 'activestorage/lib/active_storage/previewer.rb', line 12

def self.accept?(blob)
  false
end

Instance Attribute Details

#blob (readonly)

[ GitHub ]

  
# File 'activestorage/lib/active_storage/previewer.rb', line 8

attr_reader :blob

Instance Method Details

#download_blob_to_tempfile(&block) (private)

Downloads the blob to a tempfile on disk. Yields the tempfile.

[ GitHub ]

  
# File 'activestorage/lib/active_storage/previewer.rb', line 29

def download_blob_to_tempfile(&block) #:doc:
  blob.open tmpdir: tmpdir, &block
end

#draw(*argv) (private)

Executes a system command, capturing its binary output in a tempfile. Yields the tempfile.

Use this method to shell out to a system library (e.g. muPDF or FFmpeg) for preview image generation. The resulting tempfile can be used as the :io value in an attachable ::Hash:

def preview
  download_blob_to_tempfile do |input|
    draw "my-drawing-command", input.path, "--format", "png", "-" do |output|
      yield io: output, filename: "#{blob.filename.base}.png", content_type: "image/png"
    end
  end
end

The output tempfile is opened in the directory returned by #tmpdir.

[ GitHub ]

  
# File 'activestorage/lib/active_storage/previewer.rb', line 47

def draw(*argv) #:doc:
  open_tempfile do |file|
    instrument :preview, key: blob.key do
      capture(*argv, to: file)
    end

    yield file
  end
end

#logger (private)

[ GitHub ]

  
# File 'activestorage/lib/active_storage/previewer.rb', line 86

def logger #:doc:
  ActiveStorage.logger
end

#preview(**options)

Override this method in a concrete subclass. Have it yield an attachable preview image (i.e. anything accepted by Attached::One#attach). Pass the additional options to the underlying blob that is created.

Raises:

  • (NotImplementedError)
[ GitHub ]

  
# File 'activestorage/lib/active_storage/previewer.rb', line 23

def preview(**options)
  raise NotImplementedError
end

#tmpdir (private)

[ GitHub ]

  
# File 'activestorage/lib/active_storage/previewer.rb', line 90

def tmpdir #:doc:
  Dir.tmpdir
end