在Carrierwave中使用不同的S3存储桶进行生产和开发

deb*_*deb 4 ruby-on-rails amazon-s3 paperclip ruby-on-rails-3 carrierwave

我开始玩Carrierwave,作为Paperclip的替代品.

我可以从文档中看到要使用S3我应该在初始化程序中配置Fog:

CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider               => 'AWS',       # required
    :aws_access_key_id      => 'xxx',       # required
    :aws_secret_access_key  => 'yyy',       # required
    :region                 => 'eu-west-1'  # optional, defaults to 'us-east-1'
  }

end
Run Code Online (Sandbox Code Playgroud)

但是,如何为不同的环境设置不同的存储桶?使用回形针,我将在yml文件中为开发/生产/等指定不同的凭据和/或存储桶.使用carrierwave的最佳方法是什么?

num*_*407 5

如果你想要的话,你可以完全以同样的方式做到这一点,就像这个完全没有经过考验的想法:

# config/initializers/carrierwave.rb
CarrierWave.configure do |config|
  my_config = "#{Rails.root}/config/fog_credentials.yml"

  YAML.load_file(my_config)[Rails.env].each do |key, val|
    config.send("#{key}=", val)
  end
end

# config/fog_credentials.yml
common: &common
  aws_access_key: 'whatever'
  ...
  fog_credentials:
    provider: 'whoever'
    ...
production:
  <<: *common
  fog_directory: 'my-production-bucket'
development:
  <<: *common
  fog_directory: 'my-dev-bucket'
Run Code Online (Sandbox Code Playgroud)

或者如果你想放弃YAML,你总是可以在初始化程序中测试环境并使用case或条件,最简单的方法是:

CarrierWave.configure.do |config|
  if Rails.env.development?
    # configure one env
  else
    # configure another
  end

  # configure common stuff
end
Run Code Online (Sandbox Code Playgroud)