Module: ImportableAttachments::Base::ClassMethods

Defined in:
lib/importable_attachments/base.rb

Instance Method Summary collapse

Instance Method Details

#has_importable_attachment(options) ⇒ Object

:call-seq: has_importable_attachment opts

opts

:import_method
:import_into
:spreadsheet_columns


13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/importable_attachments/base.rb', line 13

def has_importable_attachment(options)
  lopt = {import_method: :import_rows}
  lopt.merge! options

  validate_importable_attachment_options lopt
  install_importable_attachment_options lopt
  install_importable_attachment_associations
  install_importable_attachment_validations
  install_importable_attachment_assignment_protection

  include InstanceMethods
  include ImportableAttachments::Importers::Importer

  # for assigning attachment to new record
  after_create :import_attachment
end

#install_importable_attachment_assignment_protectionObject



71
72
73
74
75
# File 'lib/importable_attachments/base.rb', line 71

def install_importable_attachment_assignment_protection
  attr_accessible :attachment, :attachment_attributes, :attachment_id
  accepts_nested_attributes_for :attachment, :allow_destroy => true,
    :reject_if => :all_blank
end

#install_importable_attachment_associationsObject



47
48
49
50
51
52
# File 'lib/importable_attachments/base.rb', line 47

def install_importable_attachment_associations
  has_one :attachment, :dependent => :nullify, :as => :attachable
  delegate :io_stream, :to => :attachment, :prefix => true
  delegate :io_stream_url, :to => :attachment, :prefix => true
  delegate :io_stream_file_name, :to => :attachment, :prefix => true
end

#install_importable_attachment_options(options) ⇒ Object



40
41
42
43
44
45
# File 'lib/importable_attachments/base.rb', line 40

def install_importable_attachment_options(options)
  [:import_method, :import_into, :spreadsheet_columns].each do |sym|
    cattr_accessor sym
    self.send("#{sym}=".to_sym, options[sym])
  end
end

#install_importable_attachment_validationsObject



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/importable_attachments/base.rb', line 54

def install_importable_attachment_validations
  validates :attachment, :associated => true
  validate do |record|
    if @invalid_extension
      invalid_attachment_error "invalid extension: .#{@invalid_extension}"
    end
    if @columns_not_found
      invalid_attachment_error "column(s) not found: #{@columns_not_found}"
    end
    if !@row_errors.blank?
      invalid_attachment_error "failed to import #{@row_errors.length} record(s)"
      @row_errors.each {|row| attachment.errors.add(:base, row)}
    end
  end

end

#validate_importable_attachment_options(options) ⇒ Object



30
31
32
33
34
35
36
37
38
# File 'lib/importable_attachments/base.rb', line 30

def validate_importable_attachment_options(options)
  [:spreadsheet_columns, :import_into].each do |sym|
    raise RuntimeError, "has_importable_attachment: needs :#{sym}" unless options.has_key? sym
  end

  unless options[:spreadsheet_columns].is_a?(Enumerable)
    raise RuntimeError, 'has_importable_attachment: :spreadsheet_columns must be Enumerable'
  end
end