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
|
# File 'lib/paperclip/staging.rb', line 42
def define_accessor_staging
name = @name
staging_getter_name = "#{name.to_s}_staging".to_sym
staging_setter_name = "#{name.to_s}_staging=".to_sym
already_updated_ivar = "@attachment_#{name}_already_updated".to_sym
@klass.send :define_method, staging_getter_name do
ivar = "@attachment_#{name}"
attachment = instance_variable_get(ivar)
return nil unless attachment
queued = attachment.queued_for_write[:original]
if queued
filename = attachment.original_filename
type = attachment.content_type
body = File.read(queued.path)
[filename, type, body].map{|text|Base64.strict_encode64(text)}.join('|')
end
end
old_attachment_setter = "#{name.to_s}_original_setter".to_sym
@klass.send :alias_method, old_attachment_setter, "#{@name}="
@klass.send :define_method, "#{@name}=" do |file|
instance_variable_set(already_updated_ivar, true)
send(old_attachment_setter, file)
end
@klass.send :define_method, staging_setter_name do |value|
return if value.blank?
already_updated = instance_variable_get(already_updated_ivar)
return if already_updated
filename, type, body = value.split('|').map{|text|Base64.strict_decode64(text)}
send(name).assign(NamedStringIO.new(body, filename, type))
end
end
|