module FileFolder::ClassMethods
Attributes
file_field[RW]
file_folder_repository[RW]
file_formats[RW]
filefield_flag[RW]
Public Instance Methods
file_folder_enabled?()
click to toggle source
Getter to check if model is enabled with file_folder
# File lib/file_folder.rb, line 15 def file_folder_enabled? @filefield_flag.nil? ? false : @filefield_flag end
file_folder_field(file_field, options = {})
click to toggle source
Generates file field from file_field
arguments and provides methods like if file_field
is “assignment” then it provides methods on top of it as
# File lib/file_folder.rb, line 21 def file_folder_field(file_field, options = {}) if options.is_a?(Hash) @file_formats ||= {} @file_formats[file_field] = options[:formats].is_a?(Array) ? options[:formats].collect { |x| x.starts_with?(".") ? x : ".#{x}" } : [".txt", ".docx", ".jpeg", ".pdf"] else raise "InvalidArguments" end @file_field ||=[] @file_field << file_field send(:after_save, "#{file_field}_store!") send(:after_destroy, "#{file_field}_destroy!") define_method "#{file_field}" do @ff_file_buffer.nil? ? (send("#{file_field}_persisted?") ? File.read(send("#{file_field}_path")) : nil) : @ff_file_buffer end define_method "#{file_field}?" do send("#{file_field}").nil? ? false : true end define_method "#{file_field}=" do |file_upload| if file_upload.class == ActionDispatch::Http::UploadedFile return false unless self.class.file_formats[file_field].include?(File.extname(file_upload.original_filename).downcase) @ff_file_buffer = File.read(file_upload.path) @ff_file_ofn = File.basename(file_upload.original_filename).gsub(/[^a-zA-Z0-9\-\._]+/, '_') elsif file_upload.class == File return false unless self.class.file_formats[file_field].include?(File.extname(file_upload.path).downcase) @ff_file_buffer = file_upload.read @ff_file_ofn = File.basename(file_upload.path).gsub(/[^a-zA-Z0-9\-\._]+/, '_') elsif file_upload.class == String #return false unless self.class.file_formats.include?(File.extname(file_upload).downcase) @ff_file_buffer = file_upload #@ff_file_ofn = File.basename(file_upload.path) #As there is nothing like original_file_name for a string :) end end define_method "#{file_field}_path" do FileUtils.mkdir_p File.join(self.class.file_folder_repository, [id.to_s, self.class.name.underscore].join('_')) end define_method "#{file_field}_path_to_write" do #directoy_path = FileUtils.mkdir_p File.join(self.class.file_folder_repository, self.id.to_s, file_field.to_s) File.join(send("#{file_field}_path"), @ff_file_ofn) end define_method "#{file_field}_persisted?" do (@ff_file_buffer.nil? and File.file?(send("#{file_field}_path"))) end define_method "#{file_field}_store!" do return unless self.class.file_folder_enabled? unless @ff_file_buffer.nil? _path_to_write = send("#{file_field}_path_to_write") File.delete(_path_to_write) if File.exist?(_path_to_write) #Clearing any existing existence File.open(_path_to_write, "wb+") { |f| f.puts(@ff_file_buffer) } @ff_file_buffer = nil @ff_file_ofn = nil #send("#{file_field}_url=", _path_to_write) self.try(:save_update) end end define_method "#{file_field}_destroy!" do return unless self.class.file_folder_enabled? @ff_file_buffer = nil # File.delete(send("#{file_field}_path")) if File.exist?(send("#{file_field}_path")) end @filefield_flag = true end