glebtv-rails-uploader 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +48 -146
- data/Rakefile +2 -2
- data/app/assets/javascripts/uploader/application.js +5 -6
- data/app/assets/javascripts/uploader/rails_admin.js +6 -25
- data/app/assets/stylesheets/uploader/application.css.sass +2 -0
- data/app/assets/stylesheets/uploader/{application.css → application.css.scss} +0 -0
- data/app/controllers/uploader/attachments_controller.rb +28 -50
- data/app/views/rails_admin/main/_form_rails_uploader.haml +1 -10
- data/app/views/uploader/default/_container.html.erb +49 -64
- data/app/views/uploader/default/_download.html.erb +16 -12
- data/app/views/uploader/default/_upload.html.erb +2 -2
- data/config/routes.rb +1 -5
- data/lib/glebtv-rails-uploader.rb +0 -1
- data/lib/uploader.rb +5 -5
- data/lib/uploader/asset.rb +84 -41
- data/lib/uploader/engine.rb +10 -6
- data/lib/uploader/fileuploads.rb +53 -31
- data/lib/uploader/helpers/field_tag.rb +24 -35
- data/lib/uploader/helpers/form_builder.rb +1 -1
- data/lib/uploader/helpers/form_tag_helper.rb +2 -3
- data/lib/uploader/hooks/formtastic.rb +10 -4
- data/lib/uploader/hooks/simple_form.rb +1 -3
- data/lib/uploader/version.rb +1 -1
- data/spec/dummy/app/models/article.rb +3 -7
- data/spec/dummy/app/models/asset.rb +26 -19
- data/spec/dummy/app/models/picture.rb +4 -4
- data/spec/dummy/config/application.rb +5 -7
- data/spec/dummy/config/environments/development.rb +1 -5
- data/spec/dummy/config/environments/production.rb +0 -4
- data/spec/dummy/config/environments/test.rb +2 -6
- data/spec/dummy/db/migrate/20120508093416_create_assets.rb +3 -1
- data/spec/factories/articles.rb +1 -0
- data/spec/factories/assets.rb +1 -0
- data/spec/fileuploads_spec.rb +2 -2
- data/spec/mongoid_spec.rb +4 -6
- data/spec/requests/attachments_controller_spec.rb +10 -2
- data/spec/spec_helper.rb +7 -3
- data/spec/uploader_spec.rb +1 -1
- data/{app → vendor}/assets/images/uploader/but_del_tag2.png +0 -0
- data/{app → vendor}/assets/images/uploader/ico_attach.png +0 -0
- data/{app → vendor}/assets/images/uploader/preloader.gif +0 -0
- data/{app → vendor}/assets/images/uploader/progressBarFillBg.png +0 -0
- data/vendor/assets/javascripts/uploader/jquery.fileupload-fp.js +8 -4
- data/{app → vendor}/assets/javascripts/uploader/jquery.fileupload-ui.js +219 -44
- data/{app → vendor}/assets/javascripts/uploader/jquery.fileupload.js +16 -74
- data/{app → vendor}/assets/javascripts/uploader/jquery.iframe-transport.js +3 -9
- data/vendor/assets/javascripts/uploader/load-image.min.js +1 -0
- data/{app → vendor}/assets/javascripts/uploader/locales/en.js +0 -0
- data/{app → vendor}/assets/javascripts/uploader/locales/ru.js +0 -0
- data/{app → vendor}/assets/javascripts/uploader/locales/uk.js +0 -0
- data/vendor/assets/javascripts/uploader/tmpl.min.js +1 -0
- data/{app/assets/stylesheets/uploader/default.css → vendor/assets/stylesheets/uploader/default.css.scss} +3 -11
- data/{app/assets/stylesheets/uploader/jquery.fileupload-ui.css → vendor/assets/stylesheets/uploader/jquery.fileupload-ui.css.scss} +0 -0
- metadata +78 -146
- data/app/assets/javascripts/uploader/canvas-to-blob.js +0 -95
- data/app/assets/javascripts/uploader/jquery.fileupload-angular.js +0 -348
- data/app/assets/javascripts/uploader/jquery.fileupload-process.js +0 -158
- data/app/assets/javascripts/uploader/jquery.fileupload-resize.js +0 -212
- data/app/assets/javascripts/uploader/jquery.fileupload-validate.js +0 -116
- data/app/assets/javascripts/uploader/jquery.ui.widget.js +0 -530
- data/app/assets/javascripts/uploader/load-image.js +0 -381
- data/app/assets/javascripts/uploader/tmpl.js +0 -86
- data/lib/file_size_validator.rb +0 -68
- data/spec/dummy/config/mongoid.yml +0 -12
@@ -1,10 +1 @@
|
|
1
|
-
=
|
2
|
-
= form.send 'uploader_field', field.method_name, field.html_attributes
|
3
|
-
:javascript
|
4
|
-
(function(d, s, id) {
|
5
|
-
var js, fjs = d.getElementsByTagName(s)[0];
|
6
|
-
if (d.getElementById(id)) return;
|
7
|
-
js = d.createElement(s); js.id = id;
|
8
|
-
js.src = "/assets/uploader/rails_admin.js";
|
9
|
-
fjs.parentNode.appendChild(js);
|
10
|
-
}(document, 'script', 'uploader-jssdk'));
|
1
|
+
= form.uploader_field(field.method_name, field.html_attributes.merge(sortable: true))
|
@@ -1,67 +1,52 @@
|
|
1
|
-
<% if field.object_name =~ /.*\[.*\]\[(.*)\]/ %>
|
2
|
-
<% assoc = true %>
|
3
|
-
<% field.object.fileupload_guid = field.object.fileupload_guid + '_' + $1 %>
|
4
|
-
<% else %>
|
5
|
-
<% assoc = false %>
|
6
|
-
<% end %>
|
7
|
-
|
8
1
|
<%= content_tag(:div, :id => field.id, :class => "uploader-dnd-area") do -%>
|
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
|
-
formData: function (form) {
|
49
|
-
return [];
|
50
|
-
},
|
51
|
-
filesContainer: container,
|
52
|
-
namespace: 'uploader',
|
53
|
-
uploadTemplateId: 'template-upload-<%= field.klass %>',
|
54
|
-
downloadTemplateId: 'template-download-<%= field.klass %>'
|
55
|
-
});
|
56
|
-
|
57
|
-
<% if field.exists? -%>
|
58
|
-
<% fv = field.values.map { |v| v.respond_to?(:to_jq_upload) ? v.to_jq_upload : v } %>
|
59
|
-
$(this).data().blueimpFileupload
|
60
|
-
._renderDownload(<%=raw fv.to_json(:root => false) %>)
|
61
|
-
.appendTo(container);
|
62
|
-
<% end -%>
|
63
|
-
container.trigger('init.sort');
|
64
|
-
}).trigger("init.uploader");
|
2
|
+
<%= hidden_field(field.object_name, :fileupload_guid, :object => field.object) if field.object.new_record? %>
|
3
|
+
|
4
|
+
<div class="uploader-files"></div>
|
5
|
+
|
6
|
+
<div class="uploader-dnd-hints">
|
7
|
+
<span class="uploader-button gray fileinput-button">
|
8
|
+
<span><%= I18n.t('uploader.button') %></span>
|
9
|
+
<%= fields_for field.object do |f| -%>
|
10
|
+
<%= f.fields_for field.method_name, field.klass.new do |m| -%>
|
11
|
+
<%= m.file_field(:data, field.input_html) %>
|
12
|
+
<% end -%>
|
13
|
+
<% end -%>
|
14
|
+
</span>
|
15
|
+
|
16
|
+
<div class="uploader-dnd-hint">
|
17
|
+
<%= I18n.t('uploader.or') %><span><%= I18n.t('uploader.drop') %></span>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
|
21
|
+
<%= render :partial => "uploader/#{field.theme}/upload", :locals => {:field => field} %>
|
22
|
+
<%= render :partial => "uploader/#{field.theme}/download", :locals => {:field => field} %>
|
23
|
+
<%= render :partial => "uploader/#{field.theme}/sortable", :locals => {:field => field} if field.sortable? %>
|
24
|
+
|
25
|
+
<script type="text/javascript">
|
26
|
+
$(function() {
|
27
|
+
var uploader, container;
|
28
|
+
container = $("#<%= field.id %> div.uploader-files");
|
29
|
+
|
30
|
+
$('#<%= field.id %> input[type="file"]').each(function(){
|
31
|
+
$(this).fileupload({
|
32
|
+
dataType: 'json',
|
33
|
+
dropZone: $("#<%= field.id %>"),
|
34
|
+
autoUpload: true,
|
35
|
+
paramName: "asset[data]",
|
36
|
+
formData: function(form){ return []; },
|
37
|
+
filesContainer: container,
|
38
|
+
namespace: 'uploader',
|
39
|
+
uploadTemplateId: 'template-upload-<%= field.klass %>',
|
40
|
+
downloadTemplateId: 'template-download-<%= field.klass %>'
|
65
41
|
});
|
66
|
-
|
42
|
+
|
43
|
+
<% if field.exists? -%>
|
44
|
+
uploader = ($(this).data('blueimp-fileupload') || $(this).data('fileupload'));
|
45
|
+
uploader
|
46
|
+
._renderDownload(<%=raw field.values.sort_by {|s| s.sort }.map(&:to_jq_upload).to_json %>)
|
47
|
+
.appendTo(container);
|
48
|
+
<% end -%>
|
49
|
+
});
|
50
|
+
});
|
51
|
+
</script>
|
67
52
|
<% end -%>
|
@@ -1,17 +1,21 @@
|
|
1
1
|
<!-- The template to display files available for download -->
|
2
2
|
<script id="template-download-<%= field.klass %>" type="text/x-tmpl">
|
3
3
|
{% for (var i=0, file; file=o.files[i]; i++) { %}
|
4
|
-
<div
|
5
|
-
|
6
|
-
<a href="
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
4
|
+
<div id="asset_{%=file.id%}" class="attach_item template-download">
|
5
|
+
<div class="buttons-panel">
|
6
|
+
<a href="#" class="del_btn delete" data-type="DELETE" data-url="/uploader/attachments/{%=file.public_token%}?klass=<%= field.klass %>"></a>
|
7
|
+
</div>
|
8
|
+
<div class="thumbnail preview">
|
9
|
+
<a href="{%=file.url%}" download="{%=file.filename%}">
|
10
|
+
<img src="{%=file.thumb_url%}" title="{%=file.filename%}" rel="gallery" />
|
11
|
+
</a>
|
12
|
+
</div>
|
13
|
+
<div class="infoHolder">
|
14
|
+
<div class="fileName">
|
15
|
+
<a href="{%=file.url%}" download="{%=file.filename%}">{%=file.filename%}</a>
|
16
|
+
</div>
|
17
|
+
<div class="fileWeight">{%=o.formatFileSize(file.size)%}</div>
|
18
|
+
</div>
|
19
|
+
</div>
|
16
20
|
{% } %}
|
17
21
|
</script>
|
@@ -2,8 +2,8 @@
|
|
2
2
|
<script id="template-upload-<%= field.klass %>" type="text/x-tmpl">
|
3
3
|
{% for (var i=0, file; file=o.files[i]; i++) { %}
|
4
4
|
<div class="attach_item loading template-upload">
|
5
|
-
<div class="
|
6
|
-
<div class="thumbnail preview"><img class="preloader" src="/assets/uploader/preloader.gif" alt=""
|
5
|
+
<div class="buttons-panel"><a href="#" class="del_btn cancel"></a></div>
|
6
|
+
<div class="thumbnail preview"><img class="preloader" src="/assets/uploader/preloader.gif" alt="preloader" /></div>
|
7
7
|
<div class="infoHolder">
|
8
8
|
<div class="fileName">{%=file.name%}</div>
|
9
9
|
<div class="fileWeight">{%=o.formatFileSize(file.size)%}</div>
|
data/config/routes.rb
CHANGED
data/lib/uploader.rb
CHANGED
@@ -12,7 +12,7 @@ module Uploader
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.guid
|
15
|
-
SecureRandom.base64(
|
15
|
+
SecureRandom.base64(16).tr('+/=', 'xyz').slice(0, 20)
|
16
16
|
end
|
17
17
|
|
18
18
|
def self.root_path
|
@@ -20,9 +20,9 @@ module Uploader
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def self.assets
|
23
|
-
['uploader
|
24
|
-
|
25
|
-
list << Pathname.new(path).relative_path_from(root_path.join(
|
23
|
+
Dir[root_path.join('vendor/assets/**/uploader/**', '*.{js,css,png,gif}')].inject([]) do |list, path|
|
24
|
+
folder = path.split('/assets/')[1].split('/')[0]
|
25
|
+
list << Pathname.new(path).relative_path_from(root_path.join("vendor/assets/#{folder}")).to_s
|
26
26
|
list
|
27
27
|
end
|
28
28
|
end
|
@@ -37,4 +37,4 @@ require 'uploader/engine'
|
|
37
37
|
|
38
38
|
if Object.const_defined?("RailsAdmin")
|
39
39
|
require "uploader/rails_admin/field"
|
40
|
-
end
|
40
|
+
end
|
data/lib/uploader/asset.rb
CHANGED
@@ -1,51 +1,94 @@
|
|
1
1
|
module Uploader
|
2
2
|
module Asset
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
3
|
+
def self.included(base)
|
4
|
+
base.send(:extend, Uploader::Asset::ClassMethods)
|
5
|
+
base.send(:include, Uploader::Asset::AssetProcessor)
|
6
|
+
|
7
|
+
base.instance_eval do
|
8
|
+
before_create :generate_public_token
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module Mongoid
|
13
|
+
def self.included(base)
|
14
|
+
base.send(:extend, Uploader::Asset::ClassMethods)
|
15
|
+
base.send(:include, Uploader::Asset::AssetProcessor)
|
16
|
+
|
17
|
+
base.instance_eval do
|
18
|
+
field :guid, type: String
|
19
|
+
field :public_token, type: String
|
20
|
+
|
21
|
+
before_create :generate_public_token
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def assetable_id_format(assetable_id)
|
26
|
+
BSON::ObjectId.from_string(assetable_id)
|
27
|
+
end
|
28
|
+
|
29
|
+
class << self
|
30
|
+
def include_root_in_json
|
31
|
+
false
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module ClassMethods
|
37
|
+
def generate_token(column)
|
38
|
+
loop do
|
39
|
+
token = Uploader.guid
|
40
|
+
break token unless where({ column => token }).exists?
|
23
41
|
end
|
24
|
-
else
|
25
|
-
self.assetable_id = params[:assetable_id]
|
26
42
|
end
|
43
|
+
end
|
27
44
|
|
28
|
-
|
45
|
+
module AssetProcessor
|
46
|
+
# Save asset
|
47
|
+
# Usage:
|
48
|
+
#
|
49
|
+
# class Asset < ActiveRecord::Base
|
50
|
+
# include Uploader::Asset
|
51
|
+
#
|
52
|
+
# def uploader_create(params, request = nil)
|
53
|
+
# self.user = request.env['warden'].user
|
54
|
+
# super
|
55
|
+
# end
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
def uploader_create(params, request = nil)
|
59
|
+
self.guid = params[:guid]
|
60
|
+
self.assetable_type = params[:assetable_type]
|
61
|
+
self.assetable_id = assetable_id_format(params[:assetable_id]) if params[:assetable_id]
|
62
|
+
save
|
63
|
+
end
|
64
|
+
|
65
|
+
# Destroy asset
|
66
|
+
# Usage (cancan example):
|
67
|
+
#
|
68
|
+
# class Asset < ActiveRecord::Base
|
69
|
+
# include Uploader::Asset
|
70
|
+
#
|
71
|
+
# def uploader_destroy(params, request = nil)
|
72
|
+
# ability = Ability.new(request.env['warden'].user)
|
73
|
+
# if ability.can? :delete, self
|
74
|
+
# super
|
75
|
+
# else
|
76
|
+
# errors.add(:id, :access_denied)
|
77
|
+
# end
|
78
|
+
# end
|
79
|
+
# end
|
80
|
+
#
|
81
|
+
def uploader_destroy(params, request)
|
82
|
+
destroy
|
83
|
+
end
|
84
|
+
|
85
|
+
def generate_public_token
|
86
|
+
self.public_token = self.class.generate_token(:public_token)
|
87
|
+
end
|
29
88
|
end
|
30
89
|
|
31
|
-
|
32
|
-
|
33
|
-
#
|
34
|
-
# class Asset < ActiveRecord::Base
|
35
|
-
# include Uploader::Asset
|
36
|
-
#
|
37
|
-
# def uploader_destroy(params, request = nil)
|
38
|
-
# ability = Ability.new(request.env['warden'].user)
|
39
|
-
# if ability.can? :delete, self
|
40
|
-
# super
|
41
|
-
# else
|
42
|
-
# errors.add(:id, :access_denied)
|
43
|
-
# end
|
44
|
-
# end
|
45
|
-
# end
|
46
|
-
#
|
47
|
-
def uploader_destroy(params, request)
|
48
|
-
destroy
|
90
|
+
def assetable_id_format(assetable_id)
|
91
|
+
assetable_id
|
49
92
|
end
|
50
93
|
end
|
51
94
|
end
|
data/lib/uploader/engine.rb
CHANGED
@@ -4,22 +4,26 @@ require 'uploader'
|
|
4
4
|
module Uploader
|
5
5
|
class Engine < ::Rails::Engine
|
6
6
|
isolate_namespace Uploader
|
7
|
-
|
7
|
+
|
8
8
|
initializer "uploader.assets_precompile" do |app|
|
9
9
|
app.config.assets.precompile += Uploader.assets
|
10
10
|
end
|
11
|
-
|
12
|
-
initializer "uploader.helpers" do
|
11
|
+
|
12
|
+
initializer "uploader.helpers" do
|
13
13
|
ActiveSupport.on_load :action_view do
|
14
14
|
ActionView::Base.send(:include, Uploader::Helpers::FormTagHelper)
|
15
15
|
ActionView::Helpers::FormBuilder.send(:include, Uploader::Helpers::FormBuilder)
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
initializer "uploader.hooks" do
|
20
20
|
require "uploader/hooks/active_record" if Object.const_defined?("ActiveRecord")
|
21
|
-
|
22
|
-
|
21
|
+
|
22
|
+
if Object.const_defined?("SimpleForm")
|
23
|
+
require "uploader/hooks/simple_form"
|
24
|
+
elsif Object.const_defined?("Formtastic")
|
25
|
+
require "uploader/hooks/formtastic"
|
26
|
+
end
|
23
27
|
end
|
24
28
|
end
|
25
29
|
end
|
data/lib/uploader/fileuploads.rb
CHANGED
@@ -4,83 +4,104 @@ module Uploader
|
|
4
4
|
base.send :extend, SingletonMethods
|
5
5
|
end
|
6
6
|
|
7
|
+
module Mongoid
|
8
|
+
def self.included(base)
|
9
|
+
base.send :include, Uploader::Fileuploads
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.include_root_in_json
|
13
|
+
false
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
7
17
|
module SingletonMethods
|
8
|
-
# Join
|
18
|
+
# Join ActiveRecord object with uploaded file
|
19
|
+
# Usage:
|
20
|
+
#
|
21
|
+
# class Article < ActiveRecord::Base
|
22
|
+
# has_one :picture, :as => :assetable, :dependent => :destroy
|
23
|
+
#
|
24
|
+
# fileuploads :picture
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
#
|
9
28
|
def fileuploads(*args)
|
10
29
|
options = args.extract_options!
|
11
|
-
|
30
|
+
|
12
31
|
class_attribute :fileuploads_options, :instance_writer => false
|
13
32
|
self.fileuploads_options = options
|
14
|
-
|
33
|
+
|
15
34
|
class_attribute :fileuploads_columns, :instance_writer => false
|
16
35
|
self.fileuploads_columns = args.map(&:to_sym)
|
17
|
-
|
36
|
+
|
18
37
|
unless self.is_a?(ClassMethods)
|
19
38
|
include InstanceMethods
|
20
39
|
extend ClassMethods
|
21
|
-
|
40
|
+
|
22
41
|
after_save :fileuploads_update, :if => :fileupload_changed?
|
23
|
-
|
42
|
+
|
24
43
|
fileuploads_columns.each { |asset| accepts_nested_attributes_for asset, :allow_destroy => true }
|
25
44
|
end
|
26
45
|
end
|
27
46
|
end
|
28
|
-
|
47
|
+
|
29
48
|
module ClassMethods
|
30
49
|
# Update reflection klass by guid
|
31
50
|
def fileupload_update(record_id, guid, method)
|
32
|
-
|
33
|
-
if defined?( Moped::BSON )
|
34
|
-
record_id = Moped::BSON::ObjectId.from_string(record_id) unless record_id.class.name == "Moped::BSON::ObjectId"
|
35
|
-
else
|
36
|
-
record_id = BSON::ObjectId.from_string(record_id) unless record_id.class.name == "BSON::ObjectId"
|
37
|
-
end
|
38
|
-
query.update_all(:assetable_id => record_id, :guid => nil)
|
51
|
+
fileupload_scope(method, guid).update_all(:assetable_id => record_id, :guid => nil)
|
39
52
|
end
|
40
|
-
|
41
|
-
# Find asset by guid
|
53
|
+
|
54
|
+
# Find asset(s) by guid
|
42
55
|
def fileupload_find(method, guid)
|
43
|
-
|
44
|
-
|
56
|
+
query = fileupload_scope(method, guid)
|
57
|
+
fileupload_multiple?(method) ? query.all : query.first
|
45
58
|
end
|
46
59
|
|
60
|
+
def fileupload_scope(method, guid)
|
61
|
+
fileupload_klass(method).where(:guid => guid, :assetable_type => base_class.name.to_s)
|
62
|
+
end
|
63
|
+
|
47
64
|
# Find class by reflection
|
48
65
|
def fileupload_klass(method)
|
49
66
|
reflect_on_association(method.to_sym).klass
|
50
67
|
end
|
51
68
|
|
69
|
+
def fileupload_multiple?(method)
|
70
|
+
association = reflect_on_association(method.to_sym)
|
71
|
+
|
72
|
+
# many? for Mongoid, :collection? for AR
|
73
|
+
method_name = association.respond_to?(:many?) ? :many? : :collection?
|
74
|
+
|
75
|
+
!!(association && association.send(method_name))
|
76
|
+
end
|
77
|
+
|
52
78
|
unless respond_to?(:base_class)
|
53
79
|
def base_class
|
54
80
|
self
|
55
81
|
end
|
56
82
|
end
|
57
83
|
end
|
58
|
-
|
84
|
+
|
59
85
|
module InstanceMethods
|
60
86
|
# Generate unique key
|
61
87
|
def fileupload_guid
|
62
88
|
@fileupload_guid ||= Uploader.guid
|
63
89
|
end
|
64
|
-
|
90
|
+
|
65
91
|
def fileupload_guid=(value)
|
66
92
|
@fileupload_changed = true unless value.blank?
|
67
93
|
@fileupload_guid = value.blank? ? nil : value
|
68
94
|
end
|
69
|
-
|
95
|
+
|
70
96
|
def fileupload_changed?
|
71
97
|
@fileupload_changed === true
|
72
98
|
end
|
73
|
-
|
99
|
+
|
74
100
|
def fileupload_multiple?(method)
|
75
|
-
|
76
|
-
if association.respond_to?(:collection?)
|
77
|
-
!!(association && association.collection?)
|
78
|
-
else
|
79
|
-
association.macro == :has_many
|
80
|
-
end
|
101
|
+
self.class.fileupload_multiple?(method)
|
81
102
|
end
|
103
|
+
|
82
104
|
# Find or build new asset object
|
83
|
-
|
84
105
|
def fileupload_asset(method)
|
85
106
|
if fileuploads_columns.include?(method.to_sym)
|
86
107
|
asset = new_record? ? self.class.fileupload_find(method, fileupload_guid) : send(method)
|
@@ -88,12 +109,13 @@ module Uploader
|
|
88
109
|
asset
|
89
110
|
end
|
90
111
|
end
|
91
|
-
|
112
|
+
|
92
113
|
def fileuploads_columns
|
93
114
|
self.class.fileuploads_columns
|
94
115
|
end
|
95
|
-
|
116
|
+
|
96
117
|
protected
|
118
|
+
|
97
119
|
def fileuploads_update
|
98
120
|
fileuploads_columns.each do |method|
|
99
121
|
self.class.fileupload_update(id, fileupload_guid, method)
|