Использование различных ковшей S3 для производства и разработки в Carrierwave - PullRequest
4 голосов
/ 11 сентября 2011

Я начинаю играть с Carrierwave , в качестве альтернативы Скрепка .

Из документации видно, что для использования 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

Однако, как мне настроить разные сегменты для разных сред? С помощью скрепки я бы указывал различные учетные данные и / или сегменты для разработки / производства / и т. Д. В файле yml. Каков наилучший способ сделать это с carrierwave?

Ответы [ 2 ]

5 голосов
/ 11 сентября 2011

Если хотите, вы можете сделать это точно так же, как эта идея, не прошедшая испытания:

# 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'

Или, если вы хотите отказаться от YAML, вы всегда можете просто протестировать окружение в инициализаторе и использовать регистр или условное выражение, самое простое что-то вроде:

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

  # configure common stuff
end
1 голос
/ 05 декабря 2013
class S3ArticleUploader < CarrierWave::Uploader::Base

  if Rails.env.test?
    storage :file
  else
    storage :fog
  end

  def fog_directory
    ARTICLE_UPLOADER_BUCKET
  end

  def store_dir
    "#{ model.parent_id }/#{ model.id }"
  end

end

# config/environments/development.rb
ARTICLE_UPLOADER_BUCKET = 'development-articles'

# config/environments/production.rb
ARTICLE_UPLOADER_BUCKET = 'production-articles'

вызывает метод fog_directory, когда вы не в TestEnvironment и инициализируете правильное ВЕДРО.

, вы также можете сделать это следующим образом:

  def store_dir
    if self._storage == CarrierWave::Storage::File
      "#{Rails.root}/tmp/files/#{ model.parent_id }/#{ model.id }"
    elsif self._storage == CarrierWave::Storage::Fog
      "#{ model.parent_id }/#{ model.id }"
    end
  end

v2

class S3ArticleUploader < CarrierWave::Uploader::Base

  if Rails.env.test?
    storage :file
  else
    storage :fog
  end

  def initialize
    self.fog_directory = ARTICLE_UPLOADER_BUCKET
  end

  def store_dir
    "#{ model.parent_id }/#{ model.id }"
  end

end
...