Настройте среду для использования различных путей хранения в Amazon S3 с Carrierwave - PullRequest
7 голосов
/ 04 августа 2011

Я бы хотел, чтобы в моем контейнере S3 были отдельные папки, чтобы производственная база данных была очищена от среды разработки. Я не уверен, как это сделать, вот скелет, который я придумал в инициализаторе carrierwave:

if Rails.env.test? or Rails.env.development?
   CarrierWave.configure do |config|
     //configure dev storage path
   end
end

if Rails.production?
   CarrierWave.configure do |config|
     //configure prod storage path
   end
end

Ответы [ 3 ]

5 голосов
/ 04 августа 2011

Два варианта:

Вариант 1: Вам не нужно организовывать файлы по идентификатору модели

В вашем carrierwave.rb инициализаторе:

Rails.env.production? ? (primary_folder = "production") : (primary_folder = "test")

CarrierWave.configure do |config|
  # stores in either "production/..." or "test/..." folders
  config.store_dir = "#{primary_folder}/uploads/images"
end

Вариант 2. Вам НЕОБХОДИМО организовать файлы по идентификатору модели (т.е. идентификатору пользователя)

В файле загрузчика (т. Е. image_uploader.rb в каталоге uploaders):

class ImageUploader < CarrierWave::Uploader::Base

  ...

  # Override the directory where uploaded files will be stored.
  def store_dir
    Rails.env.production? ? (primary_folder = "production") : (primary_folder = "test")

    # stores in either "production/..." or "test/..." folders
    "#{primary_folder}/uploads/images/#{model.id}"
  end

  ...

end
2 голосов
/ 25 мая 2015

Рассмотрим следующий инициализатор:

#config/initializers/carrierwave.rb

CarrierWave.configure do |config|
  config.enable_processing = true

  # For testing, upload files to local `tmp` folder.
  if Rails.env.test?
    config.storage = :file
    config.root = "#{Rails.root}/tmp/"
  elsif Rails.env.development?
    config.storage = :file
    config.root = "#{Rails.root}/public/"
  else #staging, production
    config.fog_credentials = {
      :provider              => 'AWS',
      :aws_access_key_id     => ENV['S3_KEY'],
      :aws_secret_access_key => ENV['S3_SECRET']
    }
    config.cache_dir = "#{Rails.root}/tmp/uploads" # To let CarrierWave work on heroku
    config.fog_directory    = ENV['S3_BUCKET']
    config.fog_public     = false
    config.storage = :fog
  end
end
  • При разработке загружаемые файлы отправляются в локальный общедоступный каталог.
  • В тестовом режиме в каталог Rails tmp.
  • И, наконец, в «другой» среде (обычно производственной или промежуточной) мы направляем файлы на S3, используя переменные среды, чтобы определить, какие учетные данные корзины и AWS использовать.
0 голосов
/ 07 апреля 2013

Используйте разные корзины Amazon s3 для разных сред.В ваших .rb файлах различных сред установите специфическую среду asset_host.Тогда вы можете избежать обнаружения среды Rails в загрузчике.

Например, в production.rb:

config.action_controller.asset_host = "production_bucket_name.s3.amazonaws.com"

asset_host в development.rb становится:

config.action_controller.asset_host = "development_bucket_name.s3.amazonaws.com"

и т. Д.

(Также рассмотрите возможность использования CDN вместо хостинга непосредственно из S3).

Тогда ваш загрузчик станет:

class ImageUploader < CarrierWave::Uploader::Base

  ...

  # Override the directory where uploaded files will be stored.
  def store_dir
    "uploads/images/#{model.id}"
  end

  ...

end

Это лучший метод източка зрения репликации производства в различных других средах.

...