3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
# File 'lib/uploadbox/image_uploader.rb', line 3
def uploads_one(upload_name, options={})
default_options = {
default: false,
removable: true,
retina: Uploadbox.retina,
quality: Uploadbox.retina ? (Uploadbox.retina_quality || 40) : (Uploadbox.image_quality || 80)
}
options = options.reverse_merge(default_options)
upload_versions = options.select{ |key| default_options.keys.exclude? key }
options = options.select{ |key| default_options.keys.include? key }
imageable_type = self.to_s
upload_class_name = imageable_type + upload_name.to_s.camelize
upload_class = Class.new(Image)
Uploadbox.const_set(upload_class_name, upload_class)
define_method("#{upload_name}?") { send(upload_name) and send(upload_name).file? }
define_method("attach_#{upload_name}") do |upload_id|
if upload_id.present?
self.send("attach_#{upload_name}!", upload_id)
end
end
define_method("remote_#{upload_name}_url=") do |url|
upload = Uploadbox.const_get(upload_class_name).create!(remote_file_url: url)
self.send("#{upload_name}=", upload)
end
define_method("attach_#{upload_name}!") do |upload_id|
self.send("#{upload_name}=", upload_class.find(upload_id))
end
self.define_singleton_method "update_#{upload_name}_versions!" do
Uploadbox.const_get(upload_class_name).find_each{|upload| upload.file.recreate_versions!}
end
upload_class.define_singleton_method :versions do
upload_versions
end
upload_class.define_singleton_method :removable? do
options[:removable]
end
upload_class.instance_eval do
delegate *upload_versions.keys, to: :file
default_scope -> { where(imageable_type: imageable_type).where(upload_name: upload_name.to_s) }
dynamic_uploader = Class.new(Uploadbox::ImageProcessingUploader)
Uploadbox.const_set(self.name.demodulize + 'Uploader', dynamic_uploader)
dynamic_uploader.class_eval do
upload_versions.each do |version_name, dimensions|
if options[:retina]
dimensions = dimensions.map{ |d| d * 2 }
end
version version_name do
process resize_to_fill: dimensions
process quality: quality = options[:quality]
end
def dimensions
model.class.versions[version_name]
end
def width
dimensions[0]
end
def height
dimensions[1]
end
end
end
mount_uploader :file, dynamic_uploader
end
has_one upload_name, as: :imageable, dependent: :destroy, class_name: "Uploadbox::#{self.to_s + upload_name.to_s.camelize}"
end
|