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 не менее