2011-11-15 13 views
19

Quiero subir imágenes en mi máquina local para el desarrollo pero las almacena en mi cuenta de Amazon S3 para producción.almacena imágenes localmente para desarrollo s3 para producción 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 

Existe cierta código de repetición aquí. ¿Hay alguna manera de escribir esto sin duplicación de código?

Aquí está la solución Gracias a lo grande a Jordan y Andrey continuación:

config/ambientes/development.rb

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

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

Respuesta

13

Claro . Intentar algo como esto:

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 

Además de la obvia bloque unless/merge!, también tenga en cuenta el uso de :all para :convert_options en lugar de especificar una opción idéntica tres veces.

+0

Gracias Jordan. Haré lo que sugiera y también combinaré la idea anterior para poder deshacerme de la declaración "a menos". – chell

17

Una solución más es mover el hash con params a las constantes, que se definirán en los archivos config/environments/*. Rb. A continuación, sólo puede utilizar

has_attached_file :proto, PAPERCLIP_STORAGE_OPTS 

Usando si/no ser que en el modelo, mientras que la definición de métodos es un poco desordenado creo

+0

OJ que es una gran idea. Gracias. No sé cómo premiar esto ya que necesito combinar tu respuesta con la de Jordan. – chell

3

Por qué no modificar las opciones predeterminadas de clip en production.rb?

añadir esto a config/ambientes/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'] 
    } 
}) 
Cuestiones relacionadas