8

実稼働データベースを開発環境から明確に保つために、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
4

3 に答える 3

5

2つのオプション:

オプション1:モデルIDでファイルを整理する必要はありません

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:モデルID(つまりユーザーID)でファイルを整理する必要があります

アップローダーファイル(つまりimage_uploader.rbuploadersディレクトリ内):

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
于 2011-08-04T12:10:38.803 に答える
3

次のイニシャライザを検討してください。

#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 ディレクトリに移動します。
  • 最後に、「else」環境 (通常は本番環境またはステージング環境) で、環境変数を使用してファイルを S3 に送信し、使用するバケットと AWS 資格情報を決定します。
于 2015-05-25T17:19:12.427 に答える
0

環境ごとに異なる Amazon s3 バケットを使用します。さまざまな環境の .rb ファイルで、環境固有の .rb ファイルを設定しますasset_host。そうすれば、アップローダーで Rails 環境が検出されないようにすることができます。

たとえば、production.rb では次のようになります。

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

development.rb の asset_host は次のようになります。

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

(S3 から直接ホスティングする代わりに、CDN を使用することも検討してください)。

次に、アップローダーは次のようになります。

class ImageUploader < CarrierWave::Uploader::Base

  ...

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

  ...

end

これは、他のさまざまな環境で本番環境を複製するという観点からは、より優れた手法です。

于 2013-04-06T21:41:12.650 に答える