Палец вверх 3
Перевод
Перевод

Как добавить пользовательский сервис в ActiveStorage

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

amazon-web-services ruby-on-rails rails-activestorage
задан antpaw 10 июн. 2018 г., 12:53:00
источник

2 ответа

Решение 4
Перевод
Перевод

Добавьте класс в пространство имен 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: ""
ответ дан George Claghorn 10 июн. 2018 г., 23:08:25
источник
Палец вверх 1
Перевод
Перевод

Для всех, кто заинтересовался, у меня была похожая проблема, когда я хотел использовать то же плоское хранилище с одним ведром, которое использует 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") %>
ответ дан PR Whitehead 6 авг. 2018 г., 22:35:16
источник