From cea9081347c4f61ef90674a4a571b9c7f2a6a15a Mon Sep 17 00:00:00 2001 From: Henne Vogelsang Date: Wed, 27 Apr 2016 15:09:31 +0200 Subject: [PATCH] A paperclip compatible carrierwave uploader --- app/uploaders/picture_uploader.rb | 81 ++++++++++++++++++++++++++++++ config/initializers/carrierwave.rb | 4 ++ 2 files changed, 85 insertions(+) create mode 100644 app/uploaders/picture_uploader.rb create mode 100644 config/initializers/carrierwave.rb diff --git a/app/uploaders/picture_uploader.rb b/app/uploaders/picture_uploader.rb new file mode 100644 index 00000000..ac25565b --- /dev/null +++ b/app/uploaders/picture_uploader.rb @@ -0,0 +1,81 @@ +# encoding: utf-8 + +class PictureUploader < CarrierWave::Uploader::Base + include CarrierWave::MiniMagick + include CarrierWave::Compatibility::Paperclip + + def paperclip_path + "system/#{object_class_name}/#{extra_store_dir}/#{id_partition}/:style/:basename.:extension" + end + + def object_class_name + model.class.to_s.underscore.pluralize + end + + # compatibility with our paperclip storage paths.. + def extra_store_dir + case object_class_name + when 'conferences' + 'logos' + when 'lodgings' + 'photos' + when 'sponsors' + 'logos' + when 'venues' + 'photos' + else mounted_as + end + end + + # Returns the id of the instance in a split path form. e.g. returns + # 000/001/234 for an id of 1234. Stolen from paperclip... + def id_partition + ('%09d'.freeze % model.id).scan(/\d{3}/).join('/'.freeze) + end + + # 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 + "system/#{object_class_name}/#{mounted_as}/#{model.id}" + end + + # Create different versions of your uploaded files: + version :large do + process resize_to_fit: [300, 300] + end + + version :thumb, from_version: :large do + process resize_to_fit: [100, 100] + end + + version :first, if: :sponsor? + version :first do + process resize_to_fill: [320, 180] + end + + version :second, if: :sponsor? + version :second, from_version: :first do + process resize_to_fill: [320, 150] + end + + version :others, if: :sponsor? + version :others, from_version: :second do + process resize_to_fill: [320, 120] + 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 content_type_whitelist + %r{/image\//} + end + + private + + def sponsor?(_picture) + object_class_name == 'sponsors' + end +end diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb new file mode 100644 index 00000000..7997fb57 --- /dev/null +++ b/config/initializers/carrierwave.rb @@ -0,0 +1,4 @@ +CarrierWave.configure do |config| + config.storage = :file + config.cache_dir = "#{Rails.root}/tmp/uploads" +end