Module: Paperclip::Interpolations

Extended by:
Interpolations
Included in:
Interpolations
Defined in:
lib/paperclip/interpolations.rb,
lib/paperclip/interpolations/plural_cache.rb

Overview

This module contains all the methods that are available for interpolation in paths and urls. To add your own (or override an existing one), you can either open this module and define it, or call the Paperclip.interpolates method.

Defined Under Namespace

Classes: PluralCache

Constant Summary collapse

RIGHT_HERE =

Returns the interpolated URL. Will raise an error if the url itself contains “:url” to prevent infinite recursion. This interpolation is used in the default :path to ease default specifications.

"#{__FILE__.gsub(%r{^\./}, "")}:#{__LINE__ + 3}"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.[](name) ⇒ Object

Hash access of interpolations. Included only for compatibility, and is not intended for normal use.



17
18
19
# File 'lib/paperclip/interpolations.rb', line 17

def self.[] name
  method(name)
end

.[]=(name, block) ⇒ Object

Hash assignment of interpolations. Included only for compatibility, and is not intended for normal use.



11
12
13
# File 'lib/paperclip/interpolations.rb', line 11

def self.[]= name, block
  define_method(name, &block)
end

.allObject

Returns a sorted list of all interpolations.



22
23
24
# File 'lib/paperclip/interpolations.rb', line 22

def self.all
  self.instance_methods(false).sort
end

.interpolate(pattern, *args) ⇒ Object

Perform the actual interpolation. Takes the pattern to interpolate and the arguments to pass, which are the attachment and style name. You can pass a method name on your record as a symbol, which should turn an interpolation pattern for Paperclip to use.



30
31
32
33
34
35
36
37
# File 'lib/paperclip/interpolations.rb', line 30

def self.interpolate pattern, *args
  pattern = args.first.instance.send(pattern) if pattern.kind_of? Symbol
  all.reverse.inject(pattern) do |result, tag|
    result.gsub(/:#{tag}/) do |match|
      send( tag, *args )
    end
  end
end

.plural_cacheObject



39
40
41
# File 'lib/paperclip/interpolations.rb', line 39

def self.plural_cache
  @plural_cache ||= PluralCache.new
end

Instance Method Details

#attachment(attachment, style_name) ⇒ Object

Returns the pluralized form of the attachment name. e.g. “avatars” for an attachment of :avatar



175
176
177
# File 'lib/paperclip/interpolations.rb', line 175

def attachment attachment, style_name
  plural_cache.pluralize(attachment.name.to_s.downcase)
end

#basename(attachment, style_name) ⇒ Object

Returns the basename of the file. e.g. “file” for “file.jpg”



92
93
94
# File 'lib/paperclip/interpolations.rb', line 92

def basename attachment, style_name
  attachment.original_filename.gsub(/#{Regexp.escape(File.extname(attachment.original_filename))}$/, "")
end

#class(attachment = nil, style_name = nil) ⇒ Object

Returns the underscored, pluralized version of the class name. e.g. “users” for the User class. NOTE: The arguments need to be optional, because some tools fetch all class names. Calling #class will return the expected class.



86
87
88
89
# File 'lib/paperclip/interpolations.rb', line 86

def class attachment = nil, style_name = nil
  return super() if attachment.nil? && style_name.nil?
  plural_cache.underscore_and_pluralize(attachment.instance.class.to_s)
end

#content_type_extension(attachment, style_name) ⇒ Object

Returns an extension based on the content type. e.g. “jpeg” for “image/jpeg”. If the style has a specified format, it will override the content-type detection.

Each mime type generally has multiple extensions associated with it, so if the extension from the original filename is one of these extensions, that extension is used, otherwise, the first in the list is used.



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/paperclip/interpolations.rb', line 111

def content_type_extension attachment, style_name
  mime_type = MIME::Types[attachment.content_type]
  extensions_for_mime_type = unless mime_type.empty?
    mime_type.first.extensions
  else
    []
  end

  original_extension = extension(attachment, style_name)
  style = attachment.styles[style_name.to_s.to_sym]
  if style && style[:format]
    style[:format].to_s
  elsif extensions_for_mime_type.include? original_extension
    original_extension
  elsif !extensions_for_mime_type.empty?
    extensions_for_mime_type.first
  else
    # It's possible, though unlikely, that the mime type is not in the
    # database, so just use the part after the '/' in the mime type as the
    # extension.
    %r{/([^/]*)$}.match(attachment.content_type)[1]
  end
end

#extension(attachment, style_name) ⇒ Object

Returns the extension of the file. e.g. “jpg” for “file.jpg” If the style has a format defined, it will return the format instead of the actual extension.



99
100
101
102
# File 'lib/paperclip/interpolations.rb', line 99

def extension attachment, style_name
  ((style = attachment.styles[style_name.to_s.to_sym]) && style[:format]) ||
    File.extname(attachment.original_filename).gsub(/^\.+/, "")
end

#filename(attachment, style_name) ⇒ Object

Returns the filename, the same way as “:basename.:extension” would.



44
45
46
# File 'lib/paperclip/interpolations.rb', line 44

def filename attachment, style_name
  [ basename(attachment, style_name), extension(attachment, style_name) ].reject(&:blank?).join(".")
end

#fingerprint(attachment, style_name) ⇒ Object

Returns the fingerprint of the instance.



146
147
148
# File 'lib/paperclip/interpolations.rb', line 146

def fingerprint attachment, style_name
  attachment.fingerprint
end

#hash(attachment = nil, style_name = nil) ⇒ Object

Returns a the attachment hash. See Paperclip::Attachment#hash_key for more details.



152
153
154
155
156
157
158
# File 'lib/paperclip/interpolations.rb', line 152

def hash attachment=nil, style_name=nil
  if attachment && style_name
    attachment.hash_key(style_name)
  else
    super()
  end
end

#id(attachment, style_name) ⇒ Object

Returns the id of the instance.



136
137
138
# File 'lib/paperclip/interpolations.rb', line 136

def id attachment, style_name
  attachment.instance.id
end

#id_partition(attachment, style_name) ⇒ Object

Returns the id of the instance in a split path form. e.g. returns 000/001/234 for an id of 1234.



162
163
164
165
166
167
168
169
170
171
# File 'lib/paperclip/interpolations.rb', line 162

def id_partition attachment, style_name
  case id = attachment.instance.id
  when Integer
    ("%09d" % id).scan(/\d{3}/).join("/")
  when String
    id.scan(/.{3}/).first(3).join("/")
  else
    nil
  end
end

#param(attachment, style_name) ⇒ Object

Returns the #to_param of the instance.



141
142
143
# File 'lib/paperclip/interpolations.rb', line 141

def param attachment, style_name
  attachment.instance.to_param
end

#rails_env(attachment, style_name) ⇒ Object

Returns the Rails.env constant.



78
79
80
# File 'lib/paperclip/interpolations.rb', line 78

def rails_env attachment, style_name
  Rails.env
end

#rails_root(attachment, style_name) ⇒ Object

Returns the Rails.root constant.



73
74
75
# File 'lib/paperclip/interpolations.rb', line 73

def rails_root attachment, style_name
  Rails.root
end

#style(attachment, style_name) ⇒ Object

Returns the style, or the default style if nil is supplied.



180
181
182
# File 'lib/paperclip/interpolations.rb', line 180

def style attachment, style_name
  style_name || attachment.default_style
end

#timestamp(attachment, style_name) ⇒ Object

Returns the timestamp as defined by the <attachment>_updated_at field in the server default time zone unless :use_global_time_zone is set to false. Note that a Rails.config.time_zone change will still invalidate any path or URL that uses :timestamp. For a time_zone-agnostic timestamp, use #updated_at.



62
63
64
# File 'lib/paperclip/interpolations.rb', line 62

def timestamp attachment, style_name
  attachment.instance_read(:updated_at).in_time_zone(attachment.time_zone).to_s
end

#updated_at(attachment, style_name) ⇒ Object

Returns an integer timestamp that is time zone-neutral, so that paths remain valid even if a server’s time zone changes.



68
69
70
# File 'lib/paperclip/interpolations.rb', line 68

def updated_at attachment, style_name
  attachment.updated_at
end

#url(attachment, style_name) ⇒ Object



52
53
54
55
# File 'lib/paperclip/interpolations.rb', line 52

def url attachment, style_name
  raise Errors::InfiniteInterpolationError if caller.any?{|b| b.index(RIGHT_HERE) }
  attachment.url(style_name, :timestamp => false, :escape => false)
end