Skip to Content Skip to Search

Extends models with a map between disposition & viewing_preference (which may be renamed eventually to avoid confusion)

Provides a DISPOSITIONS enum for viewing_preference

Cannot be named ContentDisposition due to collision with Shrine

Methods
A
C
D

Constants

DISPOSITIONS = %w[direct inline popup download browser].freeze
 

Instance Public methods

allow_dispositions(allow_list, default: nil)

Sets the class’s list of .allowed_dispositions and its .default_disposition

Default .allowed_dispositions is DISPOSITIONS

Default .default_disposition is the first item in .allowed_dispositions

Arguments

Given allow_list values must be present in DISPOSITIONS

When no default is provided, .default_disposition will be the first item in allow_list

Examples

class Post < ApplicationRecord
  include ContentLinkDisposition

  allow_dispositions %i[inline popup], default: :popup
end

class DownloadableFile < ApplicationRecord
  include ContentLinkDisposition

  allow_dispositions %w[direct download browser], default: :download
end
# File app/models/concerns/content_link_disposition.rb, line 54
def allow_dispositions(allow_list, default: nil)
  allow_list = Array(allow_list).map(&:to_s)
  self.allowed_dispositions = allow_list
  self.default_disposition = String(default || allow_list.first)
end

Provides the URL of the content

Adds a display=<value> query parameter

viewing_preference == 'inline'  #=> https://any_site.com?msopen=/content/:public_id/inline
viewing_preference == 'popup'   #=> .../popup
viewing_preference == 'browser' #=> .../newtab

display()

# File app/models/concerns/content_link_disposition.rb, line 98
def display
  if inline?
    :inline
  elsif popup?
    :popup
  elsif new_tab?
    :newtab
  else
    :download
  end
end

disposition()

Returns the viewing_preference as custom param disposition

Converts viewing_preference of inline to embed

# File app/models/concerns/content_link_disposition.rb, line 81
def disposition
  inline? ? "embed" : viewing_preference
end

disposition=(value)

Maps the custom param disposition to viewing_preference

Converts value of embed to inline

Dismisses any value not present in the class’s .allowed_dispositions

# File app/models/concerns/content_link_disposition.rb, line 68
def disposition=(value)
  value = (value == "embed") ? "inline" : value

  if self.class.allowed_dispositions.include?(value)
    self.viewing_preference = value
  end
end