5

我有一个 Rails3 应用程序,它使用 Carrierwave 和 Fog 将数据存储到亚马逊的 S3。我正在构建的这个应用程序要求我允许每个用户拥有自己的安全 EC2 存储桶。该应用程序的前提是用户将创建一个帐户(设计),并且我将在我的应用程序的 EC2 用户和密码下为该用户生成一个存储桶。根据当前文档,我还没有看到拥有多个存储桶的方法,因为这是在 FOG YML 中配置的。我想要求根据用户属性动态设置此 FOG_DIRECTORY 的替代方法。

我知道有一种方法可以管理动态文件夹,但这不起作用,因为我需要用户专用的存储桶。

提前致谢!

4

1 回答 1

3

假设您的存储桶已经存在。尝试以下操作:

#config/initializers/carrierwave.rb

CarrierWave.configure do |config|
  #...other configuration stuff...
  config.fog_directory = 'null.example.com'

  config.fog_host = proc do
    proc do |file|
      uploader = file.instance_variable_get :@uploader
      "http://#{uploader.fog_directory}"
    end
  end
end

请注意嵌套的过程,在撰写此答案时,carrierwave 的文档不正确。如果您希望fog_host 是动态的,则必须包装proc 以便carrierwave 配置类做正确的事情。

即使fog_directory 是稍后动态设置的。如果没有在初始化程序中设置某些内容,测试框架等会抱怨(它工作正常,设置总是被覆盖)。

#app/controllers/application_controller.rb

before_filter :set_bucket

def set_bucket
  CarrierWave.configure do |config|
    config.fog_directory = "#{current_user.id}.bucket.example.com"
  end
end

更改 set_bucket 函数以适合您的存储桶命名约定。

如果您想要开发中的固定存储桶而不是每个用户的存储桶,您可以添加一些条件逻辑。

此博客文章还概述了另一种方法

于 2012-10-06T05:04:28.197 回答