Module: Refile::Attachment

Included in:
Refile::ActiveRecord::Attachment
Defined in:
lib/refile/attachment.rb

Instance Method Summary collapse

Instance Method Details

#attachment(name, cache: :cache, store: :store, raise_errors: true, type: nil, extension: nil, content_type: nil) ⇒ void

This method returns an undefined value.

Macro which generates accessors for the given column which make it possible to upload and retrieve previously uploaded files through the generated accessors.

The ‘raise_errors` option controls whether assigning an invalid file should immediately raise an error, or save the error and defer handling it until later.

Given a record with an attachment named ‘image`, the following methods will be added:

  • ‘image`

  • ‘image=`

  • ‘remove_image`

  • ‘remove_image=`

  • ‘remote_image_url`

  • ‘remote_image_url=`

  • ‘image_url`

Examples:

class User
  extend Refile::Attachment

  attachment :image
  attr_accessor :image_id
end

Parameters:

  • name (String)

    Name of the column which accessor are generated for

  • cache (#to_s) (defaults to: :cache)

    Name of a backend in Refile.backends to use as transient cache

  • store (#to_s) (defaults to: :store)

    Name of a backend in Refile.backends to use as permanent store

  • raise_errors (true, false) (defaults to: true)

    Whether to raise errors in case an invalid file is assigned

  • type (Symbol, nil) (defaults to: nil)

    The type of file that can be uploaded, see Refile.types

  • extension (String, Array<String>, nil) (defaults to: nil)

    Limit the uploaded file to the given extension or list of extensions

  • content_type (String, Array<String>, nil) (defaults to: nil)

    Limit the uploaded file to the given content type or list of content types



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/refile/attachment.rb', line 38

def attachment(name, cache: :cache, store: :store, raise_errors: true, type: nil, extension: nil, content_type: nil)
  definition = AttachmentDefinition.new(name,
    cache: cache,
    store: store,
    raise_errors: raise_errors,
    type: type,
    extension: extension,
    content_type: content_type
  )

  define_singleton_method :"#{name}_attachment_definition" do
    definition
  end

  mod = Module.new do
    attacher = :"#{name}_attacher"

    define_method :"#{name}_attachment_definition" do
      definition
    end

    define_method attacher do
      ivar = :"@#{attacher}"
      instance_variable_get(ivar) or instance_variable_set(ivar, Attacher.new(definition, self))
    end

    define_method "#{name}=" do |value|
      send(attacher).set(value)
    end

    define_method name do
      send(attacher).get
    end

    define_method "remove_#{name}=" do |remove|
      send(attacher).remove = remove
    end

    define_method "remove_#{name}" do
      send(attacher).remove
    end

    define_method "remote_#{name}_url=" do |url|
      send(attacher).download(url)
    end

    define_method "remote_#{name}_url" do
    end

    define_method "#{name}_url" do |*args|
      Refile.attachment_url(self, name, *args)
    end

    define_method "#{name}_data" do
      send(attacher).data
    end

    define_singleton_method("to_s")    { "Refile::Attachment(#{name})" }
    define_singleton_method("inspect") { "Refile::Attachment(#{name})" }
  end

  include mod
end