module DynamicImage::Helper

DynamicImage Helper

Provides helper methods for rendering and linking to images.

Public Instance Methods

download_dynamic_image_path(record_or_array, options = {}) click to toggle source

Returns a path to the original uploaded file for download, without any processing applied. Sizing options are not supported.

# File lib/dynamic_image/helper.rb, line 73
def download_dynamic_image_path(record_or_array, options = {})
  dynamic_image_path(record_or_array, { action: :download }.merge(options))
end
download_dynamic_image_url(record_or_array, options = {}) click to toggle source

Returns a URL to the original uploaded file for download, without any processing applied. Sizing options are not supported.

# File lib/dynamic_image/helper.rb, line 80
def download_dynamic_image_url(record_or_array, options = {})
  dynamic_image_url(record_or_array, { action: :download }.merge(options))
end
dynamic_image_path(record_or_array, options = {}) click to toggle source

Returns the path for a DynamicImage::Model record. Takes the same options as dynamic_image_url

# File lib/dynamic_image/helper.rb, line 10
def dynamic_image_path(record_or_array, options = {})
  dynamic_image_url(record_or_array, { routing_type: :path }.merge(options))
end
dynamic_image_tag(record_or_array, options = {}) click to toggle source

Returns an HTML image tag for the record. If no size is given, it will render at the original size.

Options

  • :alt: If no alt text is given, it will default to the filename of the uploaded image.

See dynamic_image_url for info on how to size and cropping. Options supported by polymorphic_url will be passed to the router. Any other options will be added as HTML attributes.

Examples

image = Image.find(params[:id])
dynamic_image_tag(image)
# => <img height="200" src="..." width="320" />
dynamic_image_tag(image, size: "100x100", alt="Avatar")
# => <img alt="Avatar" height="62" src="..." width="100" />
# File lib/dynamic_image/helper.rb, line 32
def dynamic_image_tag(record_or_array, options = {})
  size = fit_size!(record_or_array, options)
  url_options = options.extract!(*allowed_dynamic_image_url_options)
  html_options = { size: }.merge(options)

  image_tag(dynamic_image_path_with_size(record_or_array,
                                         size,
                                         url_options),
            html_options)
end
dynamic_image_url(record_or_array, options = {}) click to toggle source

Returns the URL for a DynamicImage::Model record.

Options

  • :size - Desired image size, supplied as “{width}x{height}”. The image will be scaled to fit. A partial size like “100x” or “x100” can be given, if you want a fixed width or height.

  • :crop - If true, the image will be cropped to the given size.

  • :upscale - By default, DynamicImage only scale images down, never up. Pass upscale: true to force upscaling.

Any options supported by polymorphic_url are also accepted.

Examples

image = Image.find(params[:id])
dynamic_image_url(image)
# => "http://example.com/images/96...d1/300x187/1-2014062020...00.jpg"
dynamic_image_url(image, size: '100x100')
# => "http://example.com/images/72...c2/100x62/1-2014062020...00.jpg"
dynamic_image_url(image, size: '100x100', crop: true)
# => "http://example.com/images/a4...6b/100x100/1-2014062020...00.jpg"
# File lib/dynamic_image/helper.rb, line 65
def dynamic_image_url(record_or_array, options = {})
  size = fit_size!(record_or_array, options)
  dynamic_image_url_with_size(record_or_array, size, options)
end
original_dynamic_image_path(record_or_array, options = {}) click to toggle source

Returns a path to the original uploaded file, without any processing applied. Sizing options are not supported.

# File lib/dynamic_image/helper.rb, line 86
def original_dynamic_image_path(record_or_array, options = {})
  dynamic_image_path(record_or_array, { action: :original }.merge(options))
end
original_dynamic_image_url(record_or_array, options = {}) click to toggle source

Returns a URL to the original uploaded file, without any processing applied. Sizing options are not supported.

# File lib/dynamic_image/helper.rb, line 92
def original_dynamic_image_url(record_or_array, options = {})
  dynamic_image_url(record_or_array, { action: :original }.merge(options))
end
uncropped_dynamic_image_path(record_or_array, options = {}) click to toggle source

Same as dynamic_image_path, but points to an image with any pre-cropping disabled.

# File lib/dynamic_image/helper.rb, line 98
def uncropped_dynamic_image_path(record_or_array, options = {})
  dynamic_image_path(record_or_array, { action: :uncropped }.merge(options))
end
uncropped_dynamic_image_tag(record_or_array, options = {}) click to toggle source

Same as dynamic_image_tag, but renders an image with any pre-cropping disabled.

# File lib/dynamic_image/helper.rb, line 104
def uncropped_dynamic_image_tag(record_or_array, options = {})
  dynamic_image_tag(record_or_array, { action: :uncropped }.merge(options))
end
uncropped_dynamic_image_url(record_or_array, options = {}) click to toggle source

Same as dynamic_image_url, but points to an image with any pre-cropping disabled.

# File lib/dynamic_image/helper.rb, line 110
def uncropped_dynamic_image_url(record_or_array, options = {})
  dynamic_image_url(record_or_array, { action: :uncropped }.merge(options))
end

Private Instance Methods

allowed_dynamic_image_url_options() click to toggle source
# File lib/dynamic_image/helper.rb, line 116
def allowed_dynamic_image_url_options
  %i[format only_path protocol host subdomain domain
     tld_length port anchor trailing_slash script_name
     action routing_type ]
end
default_format_for_image(record) click to toggle source
# File lib/dynamic_image/helper.rb, line 122
def default_format_for_image(record)
  Mime::Type.lookup(record.safe_content_type).to_sym
end
dynamic_image_digest(record, action, size = nil) click to toggle source
# File lib/dynamic_image/helper.rb, line 126
def dynamic_image_digest(record, action, size = nil)
  key = [action || "show", record.id, size].compact.join("-")
  DynamicImage.digest_verifier.generate(key)
end
dynamic_image_path_with_size(record_or_array, size = nil, options = {}) click to toggle source
# File lib/dynamic_image/helper.rb, line 131
def dynamic_image_path_with_size(record_or_array, size = nil, options = {})
  dynamic_image_url_with_size(record_or_array,
                              size,
                              { routing_type: :path }.merge(options))
end
dynamic_image_url_with_size(record_or_array, size = nil, options = {}) click to toggle source
# File lib/dynamic_image/helper.rb, line 137
def dynamic_image_url_with_size(record_or_array, size = nil, options = {})
  record = extract_dynamic_image_record(record_or_array)
  options = {
    routing_type: :url,
    action: nil,
    format: default_format_for_image(record),
    size:
  }.merge(options)
  options[:digest] =
    dynamic_image_digest(record, options[:action], options[:size])
  polymorphic_url(record_or_array, options)
end
extract_dynamic_image_record(record_or_array) click to toggle source
# File lib/dynamic_image/helper.rb, line 150
def extract_dynamic_image_record(record_or_array)
  case record_or_array
  when Array
    record_or_array.last
  else
    record_or_array
  end
end
filename_to_alt(str) click to toggle source
# File lib/dynamic_image/helper.rb, line 159
def filename_to_alt(str)
  File.basename(str, ".*")
      .sub(/-[[:xdigit:]]{32,64}\z/, "")
      .tr("-_", " ")
      .capitalize
end
fit_size!(record_or_array, options) click to toggle source
# File lib/dynamic_image/helper.rb, line 166
def fit_size!(record_or_array, options)
  record = extract_dynamic_image_record(record_or_array)
  action = options[:action].try(:to_s)
  size_opts = options.extract!(:size, :crop, :upscale)
  if size_opts[:size]
    image_sizing(record, size_opts, (action == "uncropped"))
  else
    (action == "original" ? record.real_size : record.size).floor.to_s
  end
end
image_sizing(record, size_opts, uncropped) click to toggle source
# File lib/dynamic_image/helper.rb, line 177
def image_sizing(record, size_opts, uncropped)
  ImageSizing
    .new(record, uncropped:)
    .fit(size_opts[:size], size_opts).floor.to_s
end