class Paperclip::HasAttachedFile

Public Class Methods

define_on(klass, name, options) click to toggle source
# File lib/paperclip/has_attached_file.rb, line 3
def self.define_on(klass, name, options)
  new(klass, name, options).define
end
new(klass, name, options) click to toggle source
# File lib/paperclip/has_attached_file.rb, line 7
def initialize(klass, name, options)
  @klass = klass
  @name = name
  @options = options
end

Public Instance Methods

define() click to toggle source
# File lib/paperclip/has_attached_file.rb, line 13
def define
  define_flush_errors
  define_getters
  define_setter
  define_query
  register_new_attachment
  add_active_record_callbacks
  add_paperclip_callbacks
  add_required_validations
end

Private Instance Methods

add_active_record_callbacks() click to toggle source
# File lib/paperclip/has_attached_file.rb, line 90
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) }
  if @klass.respond_to?(:after_commit)
    @klass.send(:after_commit, on: :destroy) do
      send(name).send(:flush_deletes)
    end
  else
    @klass.send(:after_destroy) { send(name).send(:flush_deletes) }
  end
end
add_paperclip_callbacks() click to toggle source
# File lib/paperclip/has_attached_file.rb, line 103
def add_paperclip_callbacks
  @klass.send(
    :define_paperclip_callbacks,
    :post_process, :"#{@name}_post_process", :"#{@name}_validate"
  )
end
add_required_validations() click to toggle source
# File lib/paperclip/has_attached_file.rb, line 81
def add_required_validations
  options = Paperclip::Attachment.default_options.deep_merge(@options)
  if options[:validate_media_type] != false
    name = @name
    @klass.validates_media_type_spoof_detection name,
                                                if: ->(instance) { instance.send(name).dirty? }
  end
end
define_class_getter() click to toggle source
# File lib/paperclip/has_attached_file.rb, line 59
def define_class_getter
  @klass.extend(ClassMethods)
end
define_flush_errors() click to toggle source
# File lib/paperclip/has_attached_file.rb, line 26
def define_flush_errors
  @klass.send(:validates_each, @name) do |record, _attr, _value|
    attachment = record.send(@name)
    attachment.send(:flush_errors)
  end
end
define_getters() click to toggle source
# File lib/paperclip/has_attached_file.rb, line 33
def define_getters
  define_instance_getter
  define_class_getter
end
define_instance_getter() click to toggle source
# File lib/paperclip/has_attached_file.rb, line 38
def define_instance_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.empty?
      attachment.to_s(args.first)
    else
      attachment
    end
  end
end
define_query() click to toggle source
# File lib/paperclip/has_attached_file.rb, line 70
def define_query
  name = @name
  @klass.send :define_method, "#{@name}?" do
    send(name).file?
  end
end
define_setter() click to toggle source
# File lib/paperclip/has_attached_file.rb, line 63
def define_setter
  name = @name
  @klass.send :define_method, "#{@name}=" do |file|
    send(name).assign(file)
  end
end
register_new_attachment() click to toggle source
# File lib/paperclip/has_attached_file.rb, line 77
def register_new_attachment
  Paperclip::AttachmentRegistry.register(@klass, @name, @options)
end