Rails 4 - использовать облачную панель с помощью Paperclip
У меня есть приложение, которое работает уже (в стадии и prod) с S3.
Теперь мы хотим, чтобы он работал с облачным интерфейсом.
Я понял, что по какой-то причине у меня есть определения скрепки в двух местах:
/confog/initializers/paperclip.rb:
if Rails.env.production? || Rails.env.staging? || true
Paperclip::Attachment.default_options[:url] = ':s3_domain_url'
Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename'
end
/config/environments/staging.rb и /config/environments/production.rb
config.paperclip_defaults = {
:storage => :s3,
:s3_credentials => {
:bucket => s3_options[:bucket],
:access_key_id => s3_options[:access_key_id],
:secret_access_key => s3_options[:secret_access_key]
}
}
(я загружаю s3_options
из файла s3.yml, который у меня есть)
Первый вопрос - нужно ли (или, с другой стороны, неправильно) иметь эти два места с конфигурацией?
В этой конфигурации я получаю следующее:
> Profile.last.image.url
=> "https://mybucket.s3.amazonaws.com/profiles/images/000/000/001/original/someimage.jpg?1439912576"
Моя цель:
Получите cloundfront url вместо s3.
Я пробовал несколько вещей:
-
Добавьте в paperclip.rb эту строку:
Paperclip::Attachment.default_options[:s3_host_alias] = "xxxxx.cloudfront.net"
(где xxxxx
обозначает хэш облачного экрана).
Результат: ничего не изменилось.
-
Добавьте в paperclip.rb эту строку:
Paperclip::Attachment.default_options[:s3_host_name] = "xxxxx.cloudfront.net"
(где xxxxx
обозначает хэш облачного экрана).
Результат: paperclip объединяет имя ведра до:
> Profile.last.image.url
=> "https://mybucket.xxxxx.cloudfront.net/profiles/images/000/000/001/original/someimage.jpg?1439912576"
-
Отключите конфигурацию в paperclip.rb и добавьте эти строки в файл конфигурации среды (я попробовал его на development.rb):
config.paperclip_defaults = {
:
:s3_credentials => {
:
:
:url => "xxxxx.cloudfront.net",
:s3_host_name => "xxxxx.cloudfront.net",
:path => '/:class/:attachment/:id_partition/:style/:filename',
}
}
Результат: paperclip объединяет имя ведра после:
> Profile.last.image.url
=> "https://xxxxx.cloudfront.net/mybucket/profiles/images/000/000/001/original/someimage.jpg?1439912576"
-
Как (3), но добавьте эти строки на один уровень выше:
config.paperclip_defaults = {
:storage => :s3,
:url => "xxxxx.cloudfront.net",
:s3_host_name => "xxxxx.cloudfront.net",
:path => '/:class/:attachment/:id_partition/:style/:filename',
:s3_credentials => {
:
:
}
}
Результат: То же, что и (3).
Вкратце, независимо от того, что я положил в :s3_host_name
, paperclip объединяет имя ведра в некотором месте.
Некоторая идея?
Ответы
Ответ 1
Это было легче, чем я думал.
Похоже, что paperclip использует :url
либо как строку, либо как ссылку для символа, который указывает, как создать URL-адрес.
В моих файлах /config/environments/staging.rb и /config/environments/production.rb у меня есть:
config.paperclip_defaults = {
:storage => :s3,
:url => ':s3_alias_url',
:s3_host_alias => "xxxxx.cloudfront.net",
:path => '/:class/:attachment/:id_partition/:style/:filename',
:s3_credentials => {
:
:
}
}
Ответ 2
Закончено с помощью:
amazon = AppConfiguration.for :amazon
config.paperclip_defaults = {
storage: :s3,
url: ':s3_alias_url',
s3_host_alias: amazon.cloudfront,
path: '/:class/:attachment/:id_partition/:style/:filename',
s3_protocol: :https,
s3_credentials: {
bucket: amazon.s3_bucket_name,
access_key_id: amazon.aws_access_key_id,
secret_access_key: amazon.aws_secret_access_key
}
}
Альтернатива AppConfiguration
config.paperclip_defaults = {
storage: :s3,
url: ':s3_alias_url',
s3_host_alias: ENV['AMAZON_CLOUDFRONT'],
path: '/:class/:attachment/:id_partition/:style/:filename',
s3_protocol: :https,
s3_credentials: {
bucket: ENV['AMAZON_S3_BUCKET_NAME'],
access_key_id: ENV['AMAZON_AWS_ACCESS_KEY_ID'],
secret_access_key: ENV['AMAZON_AWS_SECRET_ACCESS_KEY']
}
}
Важно сказать, не используйте Rails.application.secrets здесь. Он недоступен, если файлы конфигурации загружаются по рельсам 4.1.8 не менее