Sha256: 18c906decc8a2e74cc151046574472396d699348028bedb7fd2c46bef9fda0ab

Contents?: true

Size: 1.91 KB

Versions: 1

Compression:

Stored size: 1.91 KB

Contents

module Paperclip
  class HasAttachedFile
    def self.define_on(klass, name, options)
      new(klass, name, options).define
    end

    def initialize(klass, name, options)
      @klass = klass
      @name = name
      @options = options
    end

    def define
      define_flush_errors
      define_getter
      define_setter
      define_query
      register_with_rake_tasks
      add_active_record_callbacks
      add_paperclip_callbacks
    end

    private

    def define_flush_errors
      @klass.send(:validates_each, @name) do |record, attr, value|
        attachment = record.send(@name)
        attachment.send(:flush_errors)
      end
    end

    def define_getter
      name = @name
      options = @options

      @klass.send :define_method, @name do |*args|
        ivar = "@attachment_#{name}"
        attachment = instance_variable_get(ivar)

        if attachment.nil?
          attachment = Attachment.new(name, self, options)
          instance_variable_set(ivar, attachment)
        end

        if args.length > 0
          attachment.to_s(args.first)
        else
          attachment
        end
      end
    end

    def define_setter
      name = @name

      @klass.send :define_method, "#{@name}=" do |file|
        send(name).assign(file)
      end
    end

    def define_query
      name = @name

      @klass.send :define_method, "#{@name}?" do
        send(name).file?
      end
    end

    def register_with_rake_tasks
      Paperclip::Tasks::Attachments.add(@klass, @name, @options)
    end

    def add_active_record_callbacks
      name = @name
      @klass.send(:after_save) { send(name).send(:save) }
      @klass.send(:before_destroy) { send(name).send(:queue_all_for_delete) }
      @klass.send(:after_destroy) { send(name).send(:flush_deletes) }
    end

    def add_paperclip_callbacks
      @klass.send(
        :define_paperclip_callbacks,
        :post_process, :"#{@name}_post_process")
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
paperclip-3.5.0 lib/paperclip/has_attached_file.rb