Source code file: PetPhotoUpload/app/models/pet.rb:
class Pet < ActiveRecord::Base
# Adapted from Learning Rails 3
# call the store_photo method after the database record has been saved.
after_save :store_photo
# sets the directory name of where the images are stored. The
# join utility concatenates the file name segments specific to the platform
# (e.g. windows uses back-slashes to connect filename segments)
PHOTO_STORE = Rails.root.join 'public', 'photo_store'
# allows a controller to assign the file_data to the photo field
# 'photo' will serve as a virtual attribute for the data model
def photo=(file_data)
unless file_data.blank?
@file_data = file_data
self.extension = file_data.original_filename.split('.').last.downcase
end
end
# get the file name based on the record's id and the image extension
def photo_filename
File.join PHOTO_STORE, "#{id}.#{extension}"
end
# get the location of the photo so that it can be referenced in a view
def photo_path
"/photo_store/#{id}.#{extension}"
end
def has_photo?
File.exists? photo_filename
end
private
# this utility method actually saves the image's data to the file
def store_photo
if @file_data
# create folder if it doesn't exist yet
FileUtils.mkdir_p PHOTO_STORE
File.open(photo_filename, 'wb') do |f|
f.write(@file_data.read)
end
# prevents saving the same image twice
@file_data = nil
end
end
end