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
- ID_PARTITION_LIMIT =
1_000_000_000
Class Method Summary collapse
-
.[](name) ⇒ Object
Hash access of interpolations.
-
.[]=(name, block) ⇒ Object
Hash assignment of interpolations.
-
.all ⇒ Object
Returns a sorted list of all interpolations.
-
.interpolate(pattern, *args) ⇒ Object
Perform the actual interpolation.
- .interpolators_cache ⇒ Object
- .plural_cache ⇒ Object
Instance Method Summary collapse
-
#attachment(attachment, _style_name) ⇒ Object
Returns the pluralized form of the attachment name.
-
#basename(attachment, _style_name) ⇒ Object
Returns the basename of the file.
-
#class(attachment = nil, style_name = nil) ⇒ Object
Returns the underscored, pluralized version of the class name.
-
#content_type_extension(attachment, style_name) ⇒ Object
Returns an extension based on the content type.
-
#dotextension(attachment, style_name) ⇒ Object
Returns the dot+extension of the file.
-
#extension(attachment, style_name) ⇒ Object
Returns the extension of the file.
-
#filename(attachment, style_name) ⇒ Object
Returns the filename, the same way as “:basename.:extension” would.
-
#fingerprint(attachment, _style_name) ⇒ Object
Returns the fingerprint of the instance.
-
#hash(attachment = nil, style_name = nil) ⇒ Object
Returns a the attachment hash.
-
#id(attachment, _style_name) ⇒ Object
Returns the id of the instance.
-
#id_partition(attachment, _style_name) ⇒ Object
Returns the id of the instance in a split path form.
-
#param(attachment, _style_name) ⇒ Object
Returns the #to_param of the instance.
-
#rails_env(_attachment, _style_name) ⇒ Object
Returns the Rails.env constant.
-
#rails_root(_attachment, _style_name) ⇒ Object
Returns the Rails.root constant.
-
#style(attachment, style_name) ⇒ Object
Returns the style, or the default style if nil is supplied.
-
#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.
-
#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.
-
#url(attachment, style_name) ⇒ Object
Returns the interpolated URL.
Class Method Details
.[](name) ⇒ Object
Hash access of interpolations. Included only for compatibility, and is not intended for normal use.
19 20 21 |
# File 'lib/paperclip/interpolations.rb', line 19 def self.[](name) method(name) end |
.[]=(name, block) ⇒ Object
Hash assignment of interpolations. Included only for compatibility, and is not intended for normal use.
12 13 14 15 |
# File 'lib/paperclip/interpolations.rb', line 12 def self.[]=(name, block) define_method(name, &block) @interpolators_cache = nil end |
.all ⇒ Object
Returns a sorted list of all interpolations.
24 25 26 |
# File 'lib/paperclip/interpolations.rb', line 24 def self.all 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.
32 33 34 35 36 37 38 39 |
# File 'lib/paperclip/interpolations.rb', line 32 def self.interpolate(pattern, *args) pattern = args.first.instance.send(pattern) if pattern.is_a? Symbol result = pattern.dup interpolators_cache.each do |method, token| result.gsub!(token) { send(method, *args) } if result.include?(token) end result end |
.interpolators_cache ⇒ Object
41 42 43 |
# File 'lib/paperclip/interpolations.rb', line 41 def self.interpolators_cache @interpolators_cache ||= all.reverse!.map! { |method| [method, ":#{method}"] } end |
.plural_cache ⇒ Object
45 46 47 |
# File 'lib/paperclip/interpolations.rb', line 45 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
196 197 198 |
# File 'lib/paperclip/interpolations.rb', line 196 def (, _style_name) plural_cache.pluralize_symbol(.name) end |
#basename(attachment, _style_name) ⇒ Object
Returns the basename of the file. e.g. “file” for “file.jpg”
103 104 105 |
# File 'lib/paperclip/interpolations.rb', line 103 def basename(, _style_name) File.basename(.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.
96 97 98 99 100 |
# File 'lib/paperclip/interpolations.rb', line 96 def class( = nil, style_name = nil) return super() if .nil? && style_name.nil? plural_cache.underscore_and_pluralize_class(.instance.class) 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.
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
# File 'lib/paperclip/interpolations.rb', line 130 def content_type_extension(, style_name) mime_type = MIME::Types[.content_type] extensions_for_mime_type = if mime_type.empty? [] else mime_type.first.extensions end original_extension = extension(, style_name) style = .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{/([^/]*)\z}.match(.content_type)[1] end end |
#dotextension(attachment, style_name) ⇒ Object
Returns the dot+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. If the extension is empty, no dot is added.
118 119 120 121 |
# File 'lib/paperclip/interpolations.rb', line 118 def dotextension(, style_name) ext = extension(, style_name) ext.empty? ? ext : ".#{ext}" 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.
110 111 112 113 |
# File 'lib/paperclip/interpolations.rb', line 110 def extension(, style_name) ((style = .styles[style_name.to_s.to_sym]) && style[:format]) || File.extname(.original_filename).sub(/\A\.+/, "") end |
#filename(attachment, style_name) ⇒ Object
Returns the filename, the same way as “:basename.:extension” would.
50 51 52 |
# File 'lib/paperclip/interpolations.rb', line 50 def filename(, style_name) [basename(, style_name), extension(, style_name)].delete_if(&:empty?).join(".") end |
#fingerprint(attachment, _style_name) ⇒ Object
Returns the fingerprint of the instance.
165 166 167 |
# File 'lib/paperclip/interpolations.rb', line 165 def fingerprint(, _style_name) .fingerprint end |
#hash(attachment = nil, style_name = nil) ⇒ Object
Returns a the attachment hash. See Paperclip::Attachment#hash_key for more details.
171 172 173 174 175 176 177 |
# File 'lib/paperclip/interpolations.rb', line 171 def hash( = nil, style_name = nil) if && style_name .hash_key(style_name) else super() end end |
#id(attachment, _style_name) ⇒ Object
Returns the id of the instance.
155 156 157 |
# File 'lib/paperclip/interpolations.rb', line 155 def id(, _style_name) .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.
181 182 183 184 185 186 187 188 189 190 191 192 |
# File 'lib/paperclip/interpolations.rb', line 181 def id_partition(, _style_name) case id = .instance.id when Integer if id < ID_PARTITION_LIMIT ("%09d" % id).scan(/\d{3}/).join("/") else ("%012d" % id).scan(/\d{3}/).join("/") end when String id.scan(/.{3}/).first(3).join("/") end end |
#param(attachment, _style_name) ⇒ Object
Returns the #to_param of the instance.
160 161 162 |
# File 'lib/paperclip/interpolations.rb', line 160 def param(, _style_name) .instance.to_param end |
#rails_env(_attachment, _style_name) ⇒ Object
Returns the Rails.env constant.
88 89 90 |
# File 'lib/paperclip/interpolations.rb', line 88 def rails_env(, _style_name) Rails.env end |
#rails_root(_attachment, _style_name) ⇒ Object
Returns the Rails.root constant.
83 84 85 |
# File 'lib/paperclip/interpolations.rb', line 83 def rails_root(, _style_name) Rails.root end |
#style(attachment, style_name) ⇒ Object
Returns the style, or the default style if nil is supplied.
201 202 203 |
# File 'lib/paperclip/interpolations.rb', line 201 def style(, style_name) style_name || .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.
72 73 74 |
# File 'lib/paperclip/interpolations.rb', line 72 def (, _style_name) .instance_read(:updated_at).in_time_zone(.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.
78 79 80 |
# File 'lib/paperclip/interpolations.rb', line 78 def updated_at(, _style_name) .updated_at end |
#url(attachment, style_name) ⇒ Object
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.
57 58 59 60 61 62 63 64 65 |
# File 'lib/paperclip/interpolations.rb', line 57 def url(, style_name) if Thread.current.thread_variable_get(:kt_paperclip_no_recursion) raise Errors::InfiniteInterpolationError end Thread.current.thread_variable_set(:kt_paperclip_no_recursion, true) .url(style_name, timestamp: false, escape: false) ensure Thread.current.thread_variable_set(:kt_paperclip_no_recursion, false) end |