如何向ActiveStorage添加自定义服务

时间:2018-06-10 09:53:00

标签: ruby-on-rails amazon-web-services rails-activestorage

我想向ActiveStorage添加自定义服务,因为我想覆盖ActiveStorage::Service::S3Service服务的url方法,因此我可以在S3存储桶前使用CloudFront CDN。我想我不需要presigned_url参数,我只需要密钥,因为CloudFront实例将具有对S3存储桶的完全读取权限。

2 个答案:

答案 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") %>