我想向ActiveStorage添加自定义服务,因为我想覆盖ActiveStorage::Service::S3Service服务的url
方法,因此我可以在S3存储桶前使用CloudFront CDN。我想我不需要presigned_url
参数,我只需要密钥,因为CloudFront实例将具有对S3存储桶的完全读取权限。
答案 0 :(得分:5)
在子类ActiveStorage::Service
的{{1}}命名空间中添加一个类。覆盖要覆盖的方法。例如:
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
答案 1 :(得分: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") %>