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.
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)