matharvard (owner)

Revisions

gist: 130732 Download_button fork
public
Public Clone URL: git://gist.github.com/130732.git
Embed All Files: show embed
avatar.rb #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Avatar < ActiveRecord::Base
  has_attachment :storage => :file_system, :content_type => :image, :resize_to => '40x40'
  validates_as_attachment
  validates_length_of :filename, :maximum => 255
  after_destroy { |avatar| avatar.remove_avatar_symlink }
 
  # only bother symlink when the file has been changed
  after_attachment_saved do |avatar|
    avatar.symlink_avatar
  end
 
  # We want our public urls to resemble /avatars/ID without the filename
  def public_filename_with_just_filename(thumbnail = nil)
    File.dirname(public_filename_without_just_filename(thumbnail))
  end
  alias_method_chain :public_filename, :just_filename
 
  def avatar_symlink_name
    'avatar' << File.extname(filename)
  end
 
  # remove the relative symlink if it exists
  def remove_avatar_symlink
    sym_path = File.dirname(full_filename)
    FileUtils.mkdir_p sym_path
    Dir.chdir sym_path do
      name = avatar_symlink_name
      File.delete(name) if File.symlink?(name)
      yield name if block_given?
    end
  end
 
  # use the remove_avatar_symlink block so it's within the DIr.chdir block above.
  def symlink_avatar
    remove_avatar_symlink do |name|
      File.symlink filename, name
    end
  end
 
  protected
    # sanitize the filename from funky chars
    # replace 'avatar.EXT' with '_avatar.EXT' so it doesn't clash with the symlink.
    def sanitize_filename_with_avatar(filename)
      sanitize_filename_without_avatar(filename).tap { |s| s.gsub!(/^avatar\.(\w+)$/, '_avatar.\1') }
    end
    alias_method_chain :sanitize_filename, :avatar
end