Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

store images locally for development s3 for production Rails Paperclip

Tags:

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 ]   } 
like image 660
chell Avatar asked Nov 15 '11 05:11

chell


2 Answers

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

like image 87
Andrey Kryachkov Avatar answered Sep 19 '22 20:09

Andrey Kryachkov


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.

like image 33
Jordan Running Avatar answered Sep 18 '22 20:09

Jordan Running