Module: Refile::AttachmentHelper

Defined in:
lib/refile/rails/attachment_helper.rb

Overview

Rails view helpers which aid in using Refile from views.

Defined Under Namespace

Modules: FormBuilder

Instance Method Summary collapse

Instance Method Details

#attachment_field(object_name, method, object:, **options) ⇒ ActiveSupport::SafeBuffer

Generates a form field which can be used with records which have attachments. This will generate both a file field as well as a hidden field which tracks the id of the file in the cache before it is permanently stored.

Parameters:

  • object_name

    The name of the object to generate a field for

  • method

    The name of the field

  • options (Hash)

Options Hash (**options):

  • object (Object)

    Set by the form builder, currently required for direct/presigned uploads to work.

  • direct (Boolean)

    If set to true, adds the appropriate data attributes for direct uploads with refile.js.

  • presign (Boolean)

    If set to true, adds the appropriate data attributes for presigned uploads with refile.js.

Returns:

  • (ActiveSupport::SafeBuffer)

    The generated form field



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/refile/rails/attachment_helper.rb', line 91

def attachment_field(object_name, method, object:, **options)
  options[:data] ||= {}

  attacher = object.send(:"#{method}_attacher")
  options[:accept] = attacher.accept

  if options[:direct]
    host = options[:host] || Refile.host || request.base_url
    backend_name = Refile.backends.key(attacher.cache)

    url = ::File.join(host, main_app.refile_app_path, backend_name)
    options[:data].merge!(direct: true, as: "file", url: url)
  end

  if options[:presigned] and attacher.cache.respond_to?(:presign)
    options[:data].merge!(direct: true).merge!(attacher.cache.presign.as_json)
  end

  html = hidden_field(object_name, method, value: attacher.data.to_json, object: object)
  html + file_field(object_name, method, options)
end

#attachment_image_tag(record, name, *args, fallback: nil, format: nil, host: nil, **options) ⇒ ActiveSupport::SafeBuffer?

Generates an image tag for the given attachment, adding appropriate classes and optionally falling back to the given fallback image if there is no file attached.

Returns nil if there is no file attached and no fallback specified.

Parameters:

  • fallback (String) (defaults to: nil)

    The path to an image asset to be used as a fallback

  • options (Hash)

    Additional options for the image tag

Returns:

  • (ActiveSupport::SafeBuffer, nil)

    The generated image tag

See Also:



67
68
69
70
71
72
73
74
75
76
77
# File 'lib/refile/rails/attachment_helper.rb', line 67

def attachment_image_tag(record, name, *args, fallback: nil, format: nil, host: nil, **options)
  file = record.send(name)
  classes = ["attachment", record.class.model_name.singular, name, *options[:class]]

  if file
    image_tag(attachment_url(record, name, *args, format: format, host: host), options.merge(class: classes))
  elsif fallback
    classes << "fallback"
    image_tag(fallback, options.merge(class: classes))
  end
end

#attachment_url(record, name, *args, filename: nil, format: nil, host: nil) ⇒ String?

View helper which generates a url for an attachment. This generates a URL to the Refile::App which is assumed to be mounted in the Rails application.

Optionally the name of a processor and a arguments to it can be appended.

If the filename option is not given, the filename falls back to the name.

The host defaults to Refile.host, which is useful for serving all attachments from a CDN. You can also override the host via the host option.

Returns nil if there is no file attached.

Examples:

attachment_url(@post, :document)

With processor

attachment_url(@post, :image, :fill, 300, 300, format: "jpg")

Parameters:

  • record (Refile::Attachment)

    Instance of a class which has an attached file

  • name (Symbol)

    The name of the attachment column

  • filename (String, nil) (defaults to: nil)

    The filename to be appended to the URL

  • format (String, nil) (defaults to: nil)

    A file extension to be appended to the URL

  • host (String, nil) (defaults to: nil)

    Override the host

Returns:

  • (String, nil)

    The generated URL



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/refile/rails/attachment_helper.rb', line 40

def attachment_url(record, name, *args, filename: nil, format: nil, host: nil)
  attacher = record.send(:"#{name}_attacher")
  file = attacher.get
  return unless file

  filename ||= attacher.basename || name.to_s
  format ||= attacher.extension

  backend_name = Refile.backends.key(file.backend)
  host = host || Refile.host || request.base_url

  filename = filename.parameterize("_")
  filename << "." << format.to_s if format

  ::File.join(host, main_app.refile_app_path, backend_name, *args.map(&:to_s), file.id.to_s, filename)
end