Как добавить пользовательский сервис в ActiveStorage - PullRequest
0 голосов
/ 10 июня 2018

Я хочу добавить пользовательский сервис в ActiveStorage, потому что я хочу перезаписать метод url сервиса ActiveStorage :: Service :: S3Service , чтобы я мог использовать CloudFront CDN перед моим S3ведро.Я думаю, мне не понадобятся параметры presigned_url, мне просто нужен ключ, потому что экземпляр CloudFront будет иметь полный доступ для чтения к корзине S3.

Ответы [ 2 ]

0 голосов
/ 06 августа 2018

Для всех, кто интересуется, у меня была похожая проблема, когда я хотел использовать то же плоское хранилище с одним ведром, которое использует S3Service.Это достаточно просто, когда вы знаете, как:

require "active_storage/service/disk_service"

# S3 uses a flat folder structure, so mimic that so we an sync files and databases
module ActiveStorage
  class Service::FlatDiskService < Service::DiskService
    private

    def folder_for(key)
      "/"
    end
  end
end

И конфигурация выглядит следующим образом:

local:
   service: FlatDisk
   root: <%= Rails.root.join("storage") %>
0 голосов
/ 10 июня 2018

Добавьте класс в ActiveStorage::Service пространство имен, которое подклассы ActiveStorage::Service::S3Service.Переопределите методы, которые вы хотите переопределить.Например:

# lib/active_storage/service/cloudfront_s3_service.rb 
require "active_storage/service/s3_service"

class ActiveStorage::Service::CloudfrontS3Service < ActiveStorage::Service::S3Service
  def url(key, **)
    # ...
  end
end

Обратитесь к пользовательской службе в config/storage.yml:

production:
  service: CloudfrontS3
  access_key_id: ""
  secret_access_key: ""
  region: ""
  bucket: ""
...