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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +48 -146
  3. data/Rakefile +2 -2
  4. data/app/assets/javascripts/uploader/application.js +5 -6
  5. data/app/assets/javascripts/uploader/rails_admin.js +6 -25
  6. data/app/assets/stylesheets/uploader/application.css.sass +2 -0
  7. data/app/assets/stylesheets/uploader/{application.css → application.css.scss} +0 -0
  8. data/app/controllers/uploader/attachments_controller.rb +28 -50
  9. data/app/views/rails_admin/main/_form_rails_uploader.haml +1 -10
  10. data/app/views/uploader/default/_container.html.erb +49 -64
  11. data/app/views/uploader/default/_download.html.erb +16 -12
  12. data/app/views/uploader/default/_upload.html.erb +2 -2
  13. data/config/routes.rb +1 -5
  14. data/lib/glebtv-rails-uploader.rb +0 -1
  15. data/lib/uploader.rb +5 -5
  16. data/lib/uploader/asset.rb +84 -41
  17. data/lib/uploader/engine.rb +10 -6
  18. data/lib/uploader/fileuploads.rb +53 -31
  19. data/lib/uploader/helpers/field_tag.rb +24 -35
  20. data/lib/uploader/helpers/form_builder.rb +1 -1
  21. data/lib/uploader/helpers/form_tag_helper.rb +2 -3
  22. data/lib/uploader/hooks/formtastic.rb +10 -4
  23. data/lib/uploader/hooks/simple_form.rb +1 -3
  24. data/lib/uploader/version.rb +1 -1
  25. data/spec/dummy/app/models/article.rb +3 -7
  26. data/spec/dummy/app/models/asset.rb +26 -19
  27. data/spec/dummy/app/models/picture.rb +4 -4
  28. data/spec/dummy/config/application.rb +5 -7
  29. data/spec/dummy/config/environments/development.rb +1 -5
  30. data/spec/dummy/config/environments/production.rb +0 -4
  31. data/spec/dummy/config/environments/test.rb +2 -6
  32. data/spec/dummy/db/migrate/20120508093416_create_assets.rb +3 -1
  33. data/spec/factories/articles.rb +1 -0
  34. data/spec/factories/assets.rb +1 -0
  35. data/spec/fileuploads_spec.rb +2 -2
  36. data/spec/mongoid_spec.rb +4 -6
  37. data/spec/requests/attachments_controller_spec.rb +10 -2
  38. data/spec/spec_helper.rb +7 -3
  39. data/spec/uploader_spec.rb +1 -1
  40. data/{app → vendor}/assets/images/uploader/but_del_tag2.png +0 -0
  41. data/{app → vendor}/assets/images/uploader/ico_attach.png +0 -0
  42. data/{app → vendor}/assets/images/uploader/preloader.gif +0 -0
  43. data/{app → vendor}/assets/images/uploader/progressBarFillBg.png +0 -0
  44. data/vendor/assets/javascripts/uploader/jquery.fileupload-fp.js +8 -4
  45. data/{app → vendor}/assets/javascripts/uploader/jquery.fileupload-ui.js +219 -44
  46. data/{app → vendor}/assets/javascripts/uploader/jquery.fileupload.js +16 -74
  47. data/{app → vendor}/assets/javascripts/uploader/jquery.iframe-transport.js +3 -9
  48. data/vendor/assets/javascripts/uploader/load-image.min.js +1 -0
  49. data/{app → vendor}/assets/javascripts/uploader/locales/en.js +0 -0
  50. data/{app → vendor}/assets/javascripts/uploader/locales/ru.js +0 -0
  51. data/{app → vendor}/assets/javascripts/uploader/locales/uk.js +0 -0
  52. data/vendor/assets/javascripts/uploader/tmpl.min.js +1 -0
  53. data/{app/assets/stylesheets/uploader/default.css → vendor/assets/stylesheets/uploader/default.css.scss} +3 -11
  54. data/{app/assets/stylesheets/uploader/jquery.fileupload-ui.css → vendor/assets/stylesheets/uploader/jquery.fileupload-ui.css.scss} +0 -0
  55. metadata +78 -146
  56. data/app/assets/javascripts/uploader/canvas-to-blob.js +0 -95
  57. data/app/assets/javascripts/uploader/jquery.fileupload-angular.js +0 -348
  58. data/app/assets/javascripts/uploader/jquery.fileupload-process.js +0 -158
  59. data/app/assets/javascripts/uploader/jquery.fileupload-resize.js +0 -212
  60. data/app/assets/javascripts/uploader/jquery.fileupload-validate.js +0 -116
  61. data/app/assets/javascripts/uploader/jquery.ui.widget.js +0 -530
  62. data/app/assets/javascripts/uploader/load-image.js +0 -381
  63. data/app/assets/javascripts/uploader/tmpl.js +0 -86
  64. data/lib/file_size_validator.rb +0 -68
  65. data/spec/dummy/config/mongoid.yml +0 -12
@@ -1,10 +1 @@
1
- = stylesheet_link_tag "uploader/application.css"
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
- <% # if assoc || field.object.new_record? %>
10
- <%= hidden_field(field.object_name, :fileupload_guid, :object => field.object) %>
11
- <% # end %>
12
-
13
- <div class="uploader-files" data-sort-path="<%= field.sort_path %>"></div>
14
-
15
- <div class="uploader-dnd-hints">
16
- <div class="uploader-button gray fileinput-button">
17
- <div><%= I18n.t('uploader.button') %></div>
18
- <%= fields_for field.object do |f| -%>
19
- <%= f.fields_for field.method_name, field.klass.new do |m| -%>
20
- <%= m.file_field(:data, field.input_html) %>
21
- <% end -%>
22
- <% end -%>
23
- </div>
24
-
25
- <div class="uploader-dnd-hint">
26
- <%= I18n.t('uploader.or') %>
27
- <span><%= I18n.t('uploader.drop') %></span>
28
- </div>
29
- </div>
30
-
31
- <%= render :partial => "uploader/#{field.theme}/upload", :locals => {:field => field} %>
32
- <%= render :partial => "uploader/#{field.theme}/download", :locals => {:field => field} %>
33
-
34
- <script type="text/javascript">
35
- $(function () {
36
- var container = $("#<%= field.id %> div.uploader-files");
37
-
38
- $('#<%= field.id %> input[type="file"]').attr('name', 'uploader_field').bind("init.uploader", function (e) {
39
- if (!$.fn.fileupload) {
40
- return false;
41
- }
42
-
43
- $(this).fileupload({
44
- dataType: 'json',
45
- dropZone: $("#<%= field.id %>"),
46
- autoUpload: true,
47
- paramName: "asset[data]",
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
- </script>
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 class="attach_item template-download" data-id="{%=file.id%}">
5
- <div class="delete">
6
- <a href="/" class="del_btn delete" data-type="DELETE" data-url="/uploader/attachments/{%=file.id%}?guid={%= file.guid %}&klass=<%= field.klass %>"></a>
7
- </div>
8
- <div class="thumbnail preview">
9
- <a href="{%=file.url%}"><img src="{%=file.thumb_url%}" title="{%=file.filename%}" rel="gallery"></a>
10
- </div>
11
- <div class="infoHolder">
12
- <div class="fileName">{%=file.filename%}</div>
13
- <div class="fileWeight">{%=o.formatFileSize(file.size)%}</div>
14
- </div>
15
- </div>
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="cancel"><a href="#" class="del_btn"></a></div>
6
- <div class="thumbnail preview"><img class="preloader" src="/assets/uploader/preloader.gif" alt=""></div>
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
@@ -1,7 +1,3 @@
1
1
  Uploader::Engine.routes.draw do
2
- resources :attachments, :only => [:create, :destroy] do
3
- collection do
4
- post :sort
5
- end
6
- end
2
+ resources :attachments, :only => [:create, :update, :destroy]
7
3
  end
@@ -1,3 +1,2 @@
1
1
  # encoding: utf-8
2
2
  require 'uploader'
3
- require 'file_size_validator'
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).tr('+/=', 'xyz').slice(0, 10)
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/application.css', 'uploader/application.js', 'uploader/rails_admin.js'] +
24
- Dir[root_path.join('app/assets/javascripts/uploader/**', '*.{js,css}')].inject([]) do |list, path|
25
- list << Pathname.new(path).relative_path_from(root_path.join('app/assets/javascripts')).to_s
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
@@ -1,51 +1,94 @@
1
1
  module Uploader
2
2
  module Asset
3
- # Save asset
4
- # Usage:
5
- #
6
- # class Asset < ActiveRecord::Base
7
- # include Uploader::Asset
8
- #
9
- # def uploader_create(params, request = nil)
10
- # self.user = request.env['warden'].user
11
- # super
12
- # end
13
- # end
14
- #
15
- def uploader_create(params, request = nil)
16
- self.guid = params[:guid]
17
- self.assetable_type = params[:assetable_type]
18
- if self.class.respond_to?(:collection) && !params[:assetable_id].blank?
19
- if defined?( Moped::BSON )
20
- self.assetable_id = Moped::BSON::ObjectId.from_string(params[:assetable_id])
21
- else
22
- self.assetable_id = BSON::ObjectId.from_string(params[:assetable_id])
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
- save
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
- # Destroy asset
32
- # Usage (cancan example):
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
@@ -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
- require "uploader/hooks/formtastic" if Object.const_defined?("Formtastic")
22
- require "uploader/hooks/simple_form" if Object.const_defined?("SimpleForm")
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
@@ -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 Mongoid object with uploaded file
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
- query = fileupload_klass(method).where(:guid => guid, :assetable_type => base_class.name.to_s)
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
- klass = fileupload_klass(method)
44
- klass.where(:guid => guid).first
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
- association = self.class.reflect_on_association(method.to_sym)
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)