- Mongoid
- Rspec
- Cucumber
- Devise + Cancan
- Oauth with Facebook and Google login
- Carrierwave
- Fixes for Carrierwave and Mongoid nested documents
Fork off and clone!
Find and replace all MyApp
occurences with YourAppName
.
Also have a looksy in config/mongoid.yml and change the database names appropriately.
Enjoy :)
I fixed some issues with Carrierwave and embedded documents, mostly with code from the community.
See below for an example uploader.
With the fixes included in this template, you can easily use embedded uploaders, like so:
(in models/profile.rb
)
class Profile
include Mongoid::Document
include Mongoid::Timestamps
field :name, :type => String
field :about, :type => String
field :user_id, :type => String
embeds_one :photo
accepts_nested_attributes_for :photo, :allow_destroy => true, :reject_if => :all_blank
# Mount the embedded uploader
mount_embedded_uploader :photo, :file
belongs_to :user
end
If you have a model that embeds a lot of photos, however, the above will not work. You will need something like this:
(in models/post.rb
)
def Post
include Mongoid::Document
include Mongoid::Timestamps
field :title
field :body
embeds_many :photos
accepts_nested_attributes_for :photos, :allow_destroy => true, :reject_if => proc { |attributes| attributes['file'].blank? }
after_save :save_photos
# forward validation to embedded documents
def valid?(*)
_run_validation_callbacks { super }
validate_photos
end
# Validate photos callback
def validate_photos
photos.each do |photo|
photo.send(:_run_validation_callbacks)
end
end
# Save photos callback
def save_photos
photos.each do |photo|
if photo.new_record? and photo.file.present?
photo.save!
end
end
end
end
(in models/photo.rb
)
require 'carrierwave/mongoid'
class Photo
include Mongoid::Document
field :caption, :type => String
mount_uploader :file, PhotoUploader
embedded_in :recipe
embedded_in :post
embedded_in :user
validates_presence_of :file
end
(in uploaders/photo_uploader.rb
)
class PhotoUploader < CarrierWave::Uploader::Base
# Include RMagick or ImageScience support:
# include CarrierWave::RMagick
include CarrierWave::MiniMagick
# include CarrierWave::ImageScience
# Choose what kind of storage to use for this uploader:
# storage :file
storage :fog
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
# Provide a default URL as a default if there hasn't been a file uploaded:
# def default_url
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
# end
# Process files as they are uploaded:
process :resize_to_limit => [640, 640]
process :convert => :png
#
# def scale(width, height)
# # do something
# end
# Create different versions of your uploaded files:
version :thumb do
process :convert => :png
process :resize_and_pad => [40, 40, :white]
end
version :small do
process :convert => :png
process :resize_and_pad => [100, 100, :white]
end
version :medium do
process :convert => :png
process :resize_and_pad => [460, 460, :white]
end
version :large do
process :convert => :png
process :resize_and_pad => [640, 640, :white]
end
version :huge do
process :convert => :png
process :resize_to_limit => [960, 960]
end
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
def extension_white_list
%w(jpg jpeg gif png)
end
def filename
if not super.nil?
super.chomp(File.extname(super)) + '.png'
end
end
end