Custom Paths in attachment_fu
If you’ve used attachment_fu (introduction here) in your Rails applications, you probably love its simple nature and its S3 integration. You may love less its very sparse documentation. When working on a project recently, I needed to save items to a path based on the owner of the attachment model, not the model itself.
The first attempt involved adding inline instance method calls to the
:path_prefix option passed into
has_attachment. This failed because
has_attachment works on the class level, not the instance level.
After digging deeper, I found that the only thing one needs to do in order to change the path of a save in attachment_fu is to have a defined
base_path method in your model. In the example of a user-based system with an avatar stored for each user, this might be a useful way to define your
class Avatar :image, :storage => :s3, :resize_to => '150x150' def after_save # Delete any existing avatars they have uploaded. Avatar.find(:all, :conditions => ["user_id = ?",self.user_id]).each do |ava| ava.destroy unless ava.id == self.id end end # Here we define base_path and therefore save to a custom location def base_path File.join("users", self.user.login, "avatar") end validates_as_attachment end
This is a very simple example, but this provides a model of an avatar that will save to a folder under
users/theusername with the filename the same as . For even further customization (including the filename), dig into the
full_filename method in your storage solution of choice, and override in a similar fashion.
Just a quick Rails tip to help you along your attaching way.