使用多个Rails ActiveStorage服务

4
我正在使用ActiveStorage来上传PDF和图片。由于某些隐私问题,需要将PDF存储在本地,而需要使用Amazon S3来存储图片。然而,似乎ActiveStorage只支持在每个环境中设置一种服务类型(除非您使用镜像功能,在这种情况下它不符合我的需求)。
是否有办法在同一环境中使用不同的服务配置?例如,如果一个模型has_one_attached pdf,它将使用本地服务:
local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

如果另一个模型 has_one_attached image,它将使用亚马逊服务:

amazon:
  service: S3
  access_key_id: ""
  secret_access_key: ""
3个回答

5

Rails 6.1现已支持此功能。

根据这篇文章,您可以为每个attached指定要使用的service

class MyModel < ApplicationRecord
  has_one_attached :private_document, service: :disk
  has_one_attached :public_document,  service: :s3
end

1
现在,RAILS 6.1发布后 - 似乎不支持多个has_one_attached语句!我收到了错误消息:无法配置服务。 - Sven Kirsten
在我的电脑上似乎可以工作。你的服务在 config/storage.yml 中配置正确了吗? - Samuel

1

ActiveStorage很棒,但如果您需要每个环境多种服务类型,它目前无法满足您的需求(如George Claghorn上面提到的)。如果您需要另一种选择,我通过使用Shrine解决了这个问题。

诀窍是在初始化器中设置多个“存储”:

# config/initializers/shrine.rb

Shrine.storages = {
  cache: Shrine::Storage::FileSystem.new('storage', prefix: 'uploads/cache'),
  pdf_files: Shrine::Storage::FileSystem.new('storage', prefix: 'uploads'),
  images: Shrine::Storage::S3.new(**s3_options)
}

然后在每个上传器(连接到给定模型)中使用default_storage插件。请注意,除非在两个上传器中都指定了default_storage,否则它将无法正常工作:

class PdfFileUploader < Shrine
  plugin :default_storage, cache: :cache, store: :pdf_files
end

class ImageFileUploader < Shrine
  plugin :default_storage, cache: :cache, store: :images
end

-1

抱歉,Active Storage 不支持此功能。


1
有一个开放的拉取请求看起来很快就会合并,但不幸的是它不会在Rails 6.0.0版本中发布。https://github.com/rails/rails/pull/34935 - Tom Luce
2
自 10 月 1 日以来已经合并了,所以 Rails 6.1 应该具备它。 - lumpidu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接