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)

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=

Examples:

class User
  extends 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


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
# File 'lib/refile/attachment.rb', line 39

def attachment(name, cache: :cache, store: :store, raise_errors: true, type: nil, extension: nil, content_type: nil)
  mod = Module.new do
    attacher = :"#{name}_attacher"

    define_method attacher do
      ivar = :"@#{attacher}"
      instance_variable_get(ivar) or begin
        instance_variable_set(ivar, Attacher.new(self, name,
          cache: cache,
          store: store,
          raise_errors: raise_errors,
          type: type,
          extension: extension,
          content_type: content_type
        ))
      end
    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_singleton_method("to_s")    { "Refile::Attachment(#{name})" }
    define_singleton_method("inspect") { "Refile::Attachment(#{name})" }
  end

  include mod
end