用于雾/载波的动态EC2桶选项

时间:2012-03-21 03:16:31

标签: ruby-on-rails-3 carrierwave fog

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

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

提前致谢!

1 个答案:

答案 0 :(得分: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函数以适合您的存储桶命名约定。

如果您希望在开发中使用固定存储桶而不是每个用户使用一个存储桶,则可以添加一些条件逻辑。

同样this博客文章概述了另一种方法。