2011-11-15 6 views
19

voglio caricare immagini sulla mia macchina locale per lo sviluppo, ma memorizzarli sul mio account Amazon S3 per la produzione.immagini memorizzare localmente per s3 di sviluppo per la produzione di Rails Paperclip

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 

C'è un codice ripetizione qui. C'è un modo per scrivere questo senza duplicazione del codice.

Ecco la soluzione, grazie alla grande in Giordania e Andrey sotto:

config/ambienti/development.rb

PAPERCLIP_STORAGE_OPTS = { 
    :styles => { :thumb => '40x40#', :medium => '150x200>', :large => '300x300>' }, 
    :convert_options => { :all => '-quality 92' }, 
    :processor  => [ :cropper ] 
    } 

config/ambiente/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 ] 
    } 

risposta

13

Sicuro . Provare qualcosa di simile:

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 

Oltre alla ovvia unless/merge! blocco, si noti anche l'uso di :all per :convert_options invece di specificare un'opzione identica tre volte.

+0

Grazie Jordan. Farò come suggerisci e combinerò anche l'idea di cui sopra in modo che io possa sbarazzarmi della dichiarazione a meno che. – chell

17

Un'altra soluzione è spostare l'hash con parametri alle costanti, che verranno definite nei file config/environments/*. Rb. Poi si può semplicemente utilizzare

has_attached_file :proto, PAPERCLIP_STORAGE_OPTS 

Utilizzando se/se non nel modello mentre la definizione di metodi è un po 'confuso penso

+0

Wow è un'ottima idea. Grazie. Non so come premiare questo perché ho bisogno di combinare la tua risposta con quella di Jordan. – chell

3

Perché non modificare le opzioni predefinite graffetta in production.rb?

aggiungere questo config/ambienti/production.rb:

Paperclip::Attachment.default_options.merge!({ 
    :storage => :s3, 
    :bucket => 'bucketname', 
    :s3_credentials => { 
    :access_key_id => ENV['S3_ACCESS_KEY'], 
    :secret_access_key => ENV['S3_SECRET_KEY'] 
    } 
}) 
Problemi correlati