Skip to content

Instantly share code, notes, and snippets.

@ErvalhouS
Last active August 24, 2018 21:05
Show Gist options
  • Save ErvalhouS/7ff27d473028155d42558f1f251e1ac6 to your computer and use it in GitHub Desktop.
Save ErvalhouS/7ff27d473028155d42558f1f251e1ac6 to your computer and use it in GitHub Desktop.
A monkey patch to add url for each paperclip version on the records' serialized JSONs
# frozen_string_literal: true
# Paperclip's module
module Paperclip
# Module that contains methods used on Models
module ClassMethods
# Overriding this method to add all initialized fields into class variable
def has_attached_file(name, options = {})
class_eval do
@@_paperclip_attachments ||= {}
@@_paperclip_attachments[self.name] ||= []
@@_paperclip_attachments[self.name] << name
end
# Attr accessor
define_method :_paperclip_attachments do
@@_paperclip_attachments # you can access class variable without offence
end
@@_paperclip_attachments[self.name].each do |inner_name|
define_method "remove_#{inner_name}=".to_sym do |value|
self.send(inner_name).destroy if ['1', true, 'true', 't'].include?(value)
end
end
HasAttachedFile.define_on(self, name, options)
class_eval do
# Overriding default `as_json` method to merge attachments urls into it
define_method :as_json do |inner_options = {}|
super(inner_options).merge(urls_json)
end
# A method to extract all versions' urls
define_method :urls_json do
parsed_json = {}
_paperclip_attachments[self.name].each do |inner_name|
parsed_json[inner_name] = {}
send(inner_name).styles.keys.each do |version|
if send(inner_name).url(version).present?
parsed_json[inner_name][version] = {}
parsed_json[inner_name][version] = send(inner_name).url(version)
end
end
if send(inner_name).url.present?
parsed_json[inner_name][:original] = {}
parsed_json[inner_name][:original] = send(inner_name).url
end
end
parsed_json
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment