module CarrierWave::ActiveRecord::Data

Public Instance Methods

mount_uploader(column, uploader = nil, options = {}, &block) click to toggle source

See +CarrierWave::Mount#mount_uploader+ for documentation

Calls superclass method
# File lib/carrierwave-data/orm/activerecord.rb, line 7
      def mount_uploader(column, uploader = nil, options = {}, &block)
        super
        
        attr_writer :"#{column}_data"
        
        before_validation :"decode_#{column}_data", if: :"#{column}_data?"
        
        class_eval <<-RUBY, __FILE__, __LINE__+1
          def #{column}_data?
            !!@#{column}_data
          end
          
          def decoded_#{column}_filename
            SecureRandom.hex
          end
          
          def decoded_#{column}_extension
          end
          
        private
          
          def decode_#{column}_data
            file_filename  = decoded_#{column}_filename
            file_extension = decoded_#{column}_extension
            
            if @#{column}_data.is_a?(Hash)
              file_filename   = @#{column}_data[:name] || file_filename
              file_extension  = @#{column}_data[:ext]  || file_extension
              @#{column}_data = @#{column}_data[:data]
            end
            
            file = Tempfile.new('carrierwave-data')
            file.binmode
            file.write(Base64.decode64(@#{column}_data))
            
            filename = [file_filename, file_extension].compact.join('.')
            self.#{column} = ActionDispatch::Http::UploadedFile.new(tempfile: file, filename: filename)
          end
        RUBY
      end