Хранить изображения локально для разработки s3 для производства Rails Paperclip
Я хочу загружать изображения на свою локальную машину для разработки, но хранить их на своей учетной записи Amazon S3 для производства.
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
Здесь есть несколько повторений кода.
Есть ли способ написать это без дублирования кода.
Вот решение Большое спасибо Иорданию и Андрею:
конфигурации/среда/development.rb
PAPERCLIP_STORAGE_OPTS = {
:styles => { :thumb => '40x40#', :medium => '150x200>', :large => '300x300>' },
:convert_options => { :all => '-quality 92' },
:processor => [ :cropper ]
}
конфигурации/среда/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 ]
}
Ответы
Ответ 1
Конечно. Попробуйте что-то вроде этого:
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
В дополнение к очевидному блоку unless
/merge!
также обратите внимание на использование :all
для :convert_options
вместо трехкратного задания одинаковой опции.
Ответ 2
Еще одно решение - переместить хэш с параметрами в константы, которые будут определены в файлах config/environment/*. rb. Затем вы можете просто использовать
has_attached_file :proto, PAPERCLIP_STORAGE_OPTS
Использование if/if в модели при определении методов немного беспорядочно, я думаю,
Ответ 3
Почему бы не изменить параметры по умолчанию для paperclip в production.rb?
Добавьте это в config/environment/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']
}
})