Skip to content
Mongoid::Paperclip enables you to use Paperclip with the Mongoid ODM for MongoDB.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
lib pre-release 1.0.0 Aug 12, 2016
.gitignore add tests for Paperclip.each_instance_with_attachment Aug 12, 2016
Gemfile add RSpec (#71) Aug 10, 2016


Integrate Paperclip into Mongoid.

This is actually easier and faster to set up than when using Paperclip and the ActiveRecord ORM.

Setting it up


gem "mongoid-paperclip"

Next let's assume we have a User model and we want to allow our users to upload an avatar.

Rails.root/app/models/user.rb - include the Mongoid::Paperclip module and invoke the provided class method

class User
  include Mongoid::Document
  include Mongoid::Paperclip

  has_mongoid_attached_file :avatar

That's it

That's all you have to do. Users can now upload avatars. Unlike ActiveRecord, Mongoid doesn't use migrations, so we don't need to define the Paperclip columns in a separate file. Invoking has_mongoid_attached_file will automatically define the necessary :avatar fields for you.

A more complex example

Just like Paperclip, Mongoid::Paperclip takes a second argument (hash of options) for the has_mongoid_attached_file method, so you can do more complex things such as in the following example.

class User
  include Mongoid::Document
  embeds_many :pictures

class Picture
  include Mongoid::Document
  include Mongoid::Paperclip

  embedded_in :user, :inverse_of => :pictures

  has_mongoid_attached_file :attachment,
    :path           => ':attachment/:id/:style.:extension',
    :storage        => :s3,
    :url            => ':s3_alias_url',
    :s3_host_alias  => '',
    :s3_credentials => File.join(Rails.root, 'config', 's3.yml'),
    :styles => {
      :original => ['1920x1680>', :jpg],
      :small    => ['100x100#',   :jpg],
      :medium   => ['250x250',    :jpg],
      :large    => ['500x500>',   :jpg]
    :convert_options => { :all => '-background white -flatten +matte' }
end do |picture|
  <%= picture.attachment.url %>

Note on embedded documents: if you plan to save or update the parent document, you MUST add cascade_callbacks: true to your embeds_XXX statement. Otherwise, your data will be updated but the paperclip functions will not run to copy/update your file.

In the above example:

class User
  embeds_many :pictures, :cascade_callbacks => true
  accepts_nested_attributes_for :pictures, ...
  attr_accepted :pictures_attributes, ...

@user.update_attributes({ ... :pictures => [...] })

Optional fingerprinting

Paperclip will skip calculating the fingerprint of a file when the {file}_fingerprint field is missing from the model. This can be desirable if attaching large files to a model. To disable adding the fingerprint field pass the disable_fingerprint option as in this example:

class User
  include Mongoid::Document
  include Mongoid::Paperclip

  has_mongoid_attached_file :usage_report, disable_fingerprint: true


If you want to help develop this plugin, clone the repo and bundle to get all dependencies.

Then to run the tests:


There you go

Quite a lot of people have been looking for a solution to use Paperclip with Mongoid so I hope this helps!

If you need more information on either Mongoid or Paperclip I suggest checking our their official documentation and website.


Mongoid::Paperclip is released under the MIT license. See LICENSE for more information.

You can’t perform that action at this time.