Pytanie przechowywać obrazy lokalnie do rozwoju s3 do produkcji Rails Paperclip


Chcę przesłać obrazy na moją maszynę lokalną do opracowania, ale przechowuję je na moim koncie Amazon S3 do celów produkcyjnych.

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

Tutaj jest powtórzenie kodu. Czy istnieje sposób na zapisanie tego bez duplikowania kodu?

Oto rozwiązanie Wielkie dzięki dla Jordana i Andreya poniżej:

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 ]
  }

20
2017-11-15 05:17


pochodzenie




Odpowiedzi:


Pewnie. Spróbuj czegoś takiego:

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

Oprócz oczywistych unless/merge! blok, również zwrócić uwagę na użycie :all dla :convert_options zamiast trzykrotnego określenia identycznej opcji.


14
2017-11-15 05:47



Dzięki, Jordan. Zrobię to, co sugerujesz, a także połącz powyższy pomysł, abym mógł pozbyć się stwierdzenia, o ile nie jest to możliwe. - chell


Jeszcze jednym rozwiązaniem jest przeniesienie hasza z parametrami do stałych, które zostaną zdefiniowane w plikach config / environments / *. Rb. Wtedy możesz po prostu użyć

has_attached_file :proto, PAPERCLIP_STORAGE_OPTS

Używanie if / unless w modelu przy definiowaniu metod jest trochę nieporządne


17
2017-11-15 06:34



WOw to świetny pomysł. Dzięki. Nie wiem, jak to przyznać, ponieważ muszę połączyć twoją odpowiedź z Jordanem. - chell


Dlaczego nie zmodyfikować domyślnych opcji spinacza w production.rb?

Dodaj to do config / environments / 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']
  }
})

3
2017-08-04 18:13