glebtv-rails-uploader 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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)
|