Module: AttachmentMagic::Backends::FileSystemBackend

Defined in:
lib/attachment_magic/backends/file_system_backend.rb

Overview

Methods for file system backed attachments

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object

:nodoc:



8
9
10
# File 'lib/attachment_magic/backends/file_system_backend.rb', line 8

def self.included(base) #:nodoc:
  base.before_update :rename_file
end

Instance Method Details

#attachment_path_idObject

The attachment ID used in the full path of a file



30
31
32
# File 'lib/attachment_magic/backends/file_system_backend.rb', line 30

def attachment_path_id
  ((respond_to?(:parent_id) && parent_id) || id) || 0
end

#base_pathObject

Used as the base path that #public_filename strips off full_filename to create the public path



25
26
27
# File 'lib/attachment_magic/backends/file_system_backend.rb', line 25

def base_path
  @base_path ||= Rails.root.join('public').to_s
end

#create_temp_fileObject

Creates a temp file from the currently saved file.



78
79
80
# File 'lib/attachment_magic/backends/file_system_backend.rb', line 78

def create_temp_file
  copy_to_temp_file full_filename
end

#filename=(value) ⇒ Object



72
73
74
75
# File 'lib/attachment_magic/backends/file_system_backend.rb', line 72

def filename=(value)
  @old_filename = full_filename unless filename.nil? || @old_filename
  write_attribute :filename, sanitize_filename(value)
end

#full_filenameObject

Gets the full path to the filename in this format:

# This assumes a model name like MyModel
# public/#{table_name} is the default filesystem path 
Rails.root.to_s/public/my_models/5/blah.jpg

Overwrite this method in your model to customize the filename.



19
20
21
22
# File 'lib/attachment_magic/backends/file_system_backend.rb', line 19

def full_filename
  file_system_path = self.attachment_options[:path_prefix].to_s
  Rails.root.join(file_system_path, *partitioned_path(filename)).to_s
end

#partitioned_path(*args) ⇒ Object

Partitions the given path into an array of path components.

For example, given an *args of [“foo”, “bar”], it will return ["0000", "0001", "foo", "bar"] (assuming that that id returns 1).

If the id is not an integer, then path partitioning will be performed by hashing the string value of the id with SHA-512, and splitting the result into 4 components. If the id a 128-bit UUID (as set by :uuid_primary_key => true) then it will be split into 2 components.

To turn this off entirely, set :partition => false.



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/attachment_magic/backends/file_system_backend.rb', line 45

def partitioned_path(*args)
  if respond_to?(:attachment_options) && attachment_options[:partition] == false 
    args
  elsif attachment_options[:uuid_primary_key]
    # Primary key is a 128-bit UUID in hex format. Split it into 2 components.
    path_id = attachment_path_id.to_s
    component1 = path_id[0..15] || "-"
    component2 = path_id[16..-1] || "-"
    [component1, component2] + args
  else
    path_id = attachment_path_id
    if path_id.is_a?(Integer)
      # Primary key is an integer. Split it after padding it with 0.
      ("%08d" % path_id).scan(/..../) + args
    else
      # Primary key is a String. Hash it, then split it into 4 components.
      hash = Digest::SHA512.hexdigest(path_id.to_s)
      [hash[0..31], hash[32..63], hash[64..95], hash[96..127]] + args
    end
  end
end

#public_filenameObject

Gets the public path to the file



68
69
70
# File 'lib/attachment_magic/backends/file_system_backend.rb', line 68

def public_filename()
  full_filename.gsub %r(^#{Regexp.escape(base_path)}), ''
end