I want to upload images on my local machine for development but store them on my Amazon S3 account for production.
upload.rb
if Rails.env.development? has_attached_file :photo, :styles => { :thumb => '40x40#', :medium => '150x200>', :large => '300x300>'}, :convert_options => { :thumb => "-quality 92", :medium => "-quality 92", :large => "-quality 92" }, :processors => [:cropper] else has_attached_file :photo, :styles => { :thumb => '40x40#', :medium => '150x200>', :large => '300x300>'}, :convert_options => { :thumb => "-quality 92", :medium => "-quality 92", :large => "-quality 92" }, :storage => :s3, :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", :path => ":attachment/:id/:style.:extension", :bucket => 'birthdaywall_uploads', :processors => [:cropper] end
There is some code repetition here. Is there a way to write this without code duplication.
Here is the solution Thanks big time to Jordan and Andrey below:
config/environments/development.rb
PAPERCLIP_STORAGE_OPTS = { :styles => { :thumb => '40x40#', :medium => '150x200>', :large => '300x300>' }, :convert_options => { :all => '-quality 92' }, :processor => [ :cropper ] }
config/environment/production.rb
PAPERCLIP_STORAGE_OPTS = { :styles => { :thumb => '40x40#', :medium => '150x200>', :large => '300x300>' }, :convert_options => { :all => '-quality 92' }, :storage => :s3, :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", :path => ':attachment/:id/:style.:extension', :bucket => 'birthdaywall_uploads', :processor => [ :cropper ] }
One more solution is to move the hash with params to constants, which will be defined in config/environments/*.rb files. Then you can just use
has_attached_file :proto, PAPERCLIP_STORAGE_OPTS
Using if/unless in model while defining methods is a bit messy I think
Sure. Try something like this:
paperclip_opts = { :styles => { :thumb => '40x40#', :medium => '150x200>', :large => '300x300>' }, :convert_options => { :all => '-quality 92' }, :processor => [ :cropper ] } unless Rails.env.development? paperclip_opts.merge! :storage => :s3, :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", :path => ':attachment/:id/:style.:extension', :bucket => 'birthdaywall_uploads', end has_attached_file :photo, paperclip_opts
In addition to the obvious unless
/merge!
block, also note the use of :all
for :convert_options
instead of specifying an identical option three times.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With