Skip to content
Switch branches/tags
This branch is 22 commits ahead, 15 commits behind krobertson:master.

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

DataMapper Paperclip

DM-Paperclip-S3 is a port of Thoughtbot's Paperclip plugin to work with DataMapper. This plugin is fully compatible with the original ActiveRecord-oriented Paperclip. You could take an existing ActiveRecord database and use it with DataMapper. The module also includes updates validation handling and automatic including of the necessary 'property' fields into your model.

To use it within your models, you need to ensure the three database fields are included. They are {name}_file_name, {name}_content_type, and {name}_file_size. The first two are strings, the final _file_size column is an integer. So if your user model has an avatar field, then you would add avatar_file_name, avatar_content_type, and avatar_file_size.

As with the original Paperclip plugin, it allows processing of thumbnails at the time the record is saved though ImageMagick. It processes the thumbnails through the command-line applications instead of using RMagick.

See the documentation for the has_attached_file method for options.


The code DM-Paperclip-S3 is available at Github:

git clone git://

It is regularly updated to keep in sync with the latest from Thoughtbot.

Releases are tagged within the repository and versioned the same as the original model. You can also get the latest release packaged as a gem through GitHub (Gemfile):

gem 'dm-paperclip-s3', :git => ''

This gem depends on official AWS SDK:

require 'aws-sdk'
require 'dm-paperclip-s3'


In your model:

class User
  include DataMapper::Resource
  include Paperclip::Resource
  property :id, Serial
  property :username, String
  property :thumbnail, Binary, :length => 16777215
  has_attached_file :avatar,
                    :styles => { :medium => "300x300>",
                                 :thumb => "100x100>" }
  has_attached_file :myfile, 
                    :path     => "path/on/s3",
                    :storage  => :s3,
                    :bucket   => "bucket_name",
                    :s3_endpoint    => "", # this is default and optional
                    :s3_credentials => {  :access_key_id => "S3_ACCESS_KEY",
                                          :secret_access_key => "S3_SECRET_KEY" }

You will need to add an initializer to configure Paperclip. If on Rails, can add a config/initializers/paperclip.rb, on Merb can use config/init.rb and add it to the Merb::BootLoader.after_app_loads section. Can also use environment configs, rackup file, Rake task, wherever.

Paperclip.configure do |config|
  config.root               = Rails.root # the application root to anchor relative urls (defaults to Dir.pwd)
  config.env                = Rails.env  # server env support, defaults to ENV['RACK_ENV'] or 'development'
  config.use_dm_validations = true       # validate attachment sizes and such, defaults to false
  config.processors_path    = 'lib/pc'   # relative path to look for processors, defaults to 'lib/paperclip_processors'

Your database will need to add four columns, avatar_file_name (varchar), avatar_content_type (varchar), and avatar_file_size (integer), and avatar_updated_at (datetime). You can either add these manually, auto- migrate, or use the following migration:

migration( 1, :add_user_paperclip_fields ) do
up do
    modify_table :users do
      add_column :avatar_file_name, "varchar(255)"
      add_column :avatar_content_type, "varchar(255)"
      add_column :avatar_file_size, "integer"
      add_column :avatar_updated_at, "datetime"
  down do
    modify_table :users do
      drop_columns :avatar_file_name, :avatar_content_type, :avatar_file_size, :avatar_updated_at

In your edit and new views:

<% form_for @user, { :action => url(:user), :multipart => true } do %>
  <%= file_field :name => 'avatar' %>
<% end %>

In your controller:

def create
  @user.avatar = params[:avatar]

In your show view:

<%= image_tag @user.avatar.url %>
<%= image_tag @user.avatar.url(:medium) %>
<%= image_tag @user.avatar.url(:thumb) %>

The following validations are available:

validates_attachment_presence :avatar
validates_attachment_content_type :avatar, :content_type => "image/png"
validates_attachment_size :avatar, :in => 1..10240
validates_attachment_thumbnails :avatar

In order to use validations, you must have loaded the 'dm-validations' gem into your app (available as a part of dm-more). If the gem isn't loaded before DM-Paperclip-S3 is loaded, the validation methods will be excluded. You will also need to include DataMapper::Validate into your mode:

class User
  include DataMapper::Resource
  include DataMapper::Validate
  include Paperclip::Resource
  property :id, Serial
  property :username, String
  has_attached_file :avatar,
                    :styles => { :medium => "300x300>",
                                 :thumb => "100x100>" }
  validates_attachment_size :avatar, :in => 1..5120


DataMapper port of the Paperclip plugin by Thoughtbot with Amazon S3 support




No packages published