0.02
No release in over 3 years
Low commit activity in last 3 years
Provides Mongoid integration for Shrine.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
 Dependencies

Development

>= 0
>= 0

Runtime

>= 5.0
>= 3.0.0.beta3, < 4
 Project Readme

Shrine::Plugins::Mongoid

Provides Mongoid integration for Shrine.

Installation

gem "shrine-mongoid", "~> 1.0"

Usage

Shrine.plugin :mongoid
class ImageUploader < Shrine
end
class Photo
  include Mongoid::Document
  include ImageUploader::Attachment(:image)

  field :image_data, type: String # or `type: Hash`
end

The Shrine::Attachment module will add model methods, as well as callbacks and validations to tie attachment process to the record lifecycle:

photo = Photo.new

photo.image = file # cache attachment

photo.image      #=> #<Shrine::UploadedFile @id="bc2e13.jpg" @storage_key=:cache ...>
photo.image_data #=> '{"id":"bc2e13.jpg","storage":"cache","metadata":{...}}'

photo.save # persist, promote attachment, then persist again

photo.image      #=> #<Shrine::UploadedFile @id="397eca.jpg" @storage_key=:store ...>
photo.image_data #=> '{"id":"397eca.jpg","storage":"store","metadata":{...}}'

photo.destroy # delete attachment

photo.image.exists? #=> false

Callbacks

After Save

After a record is saved, Attacher#finalize is called, which promotes cached file to permanent storage and deletes previous file if any.

photo = Photo.new

photo.image = file
photo.image.storage_key #=> :cache

photo.save
photo.image.storage_key #=> :store

After Destroy

After a record is destroyed, Attacher#destroy_attached method is called, which deletes stored attached file if any.

photo = Photo.find(photo_id)
photo.image #=> #<Shrine::UploadedFile>
photo.image.exists? #=> true

photo.destroy
photo.image.exists? #=> false

Skipping Callbacks

If you don't want the attachment module to add any callbacks to your model, you can set :callbacks to false:

plugin :mongoid, callbacks: false

Validations

If you're using the validation plugin, the attachment module will automatically merge attacher errors with model errors.

class ImageUploader < Shrine
  plugin :validation_helpers

  Attacher.validate do
    validate_max_size 10 * 1024 * 1024
  end
end
photo = Photo.new
photo.image = file
photo.valid?
photo.errors #=> { image: ["size must not be greater than 10.0 MB"] }

Attachment Presence

If you want to validate presence of the attachment, you can use ActiveModel's presence validator:

class Photo
  include Mongoid::Document
  include ImageUploader::Attachment(:image)

  validates_presence_of :image
end

Skipping Validations

If don't want the attachment module to merge file validations errors into model errors, you can set :validations to false:

plugin :mongoid, validations: false

Attacher

You can also use Shrine::Attacher directly (with or without the Shrine::Attachment module):

class Photo
  include Mongoid::Document

  field :image_data, type: String # or `type: Hash`
end
photo    = Photo.new
attacher = ImageUploader::Attacher.from_model(photo, :image)

attacher.assign(file) # cache

attacher.file    #=> #<Shrine::UploadedFile @id="bc2e13.jpg" @storage_key=:cache ...>
photo.image_data #=> '{"id":"bc2e13.jpg","storage":"cache","metadata":{...}}'

photo.save        # persist
attacher.finalize # promote
photo.save        # persist

attacher.file    #=> #<Shrine::UploadedFile @id="397eca.jpg" @storage_key=:store ...>
photo.image_data #=> '{"id":"397eca.jpg","storage":"store","metadata":{...}}'

Pesistence

The following persistence methods are added to Shrine::Attacher:

Method Description
Attacher#atomic_promote calls Attacher#promote and persists if the attachment hasn't changed
Attacher#atomic_persist saves changes if the attachment hasn't changed
Attacher#persist saves any changes to the underlying record

See persistence docs for more details.

Contributing

You can run the tests with the Rake task:

$ bundle exec rake test

License

MIT