5

Carrierwave と Fog を使用して Amazon の S3 にデータを保存する Rails3 アプリケーションがあります。私が構築しているこのアプリケーションでは、各ユーザーが独自の安全な EC2 バケットを持つことを許可する必要があります。アプリケーションの前提は、ユーザーがアカウント (devise) を作成し、アプリケーションの EC2 ユーザーとパスワードの下にそのユーザー専用のストレージ バケットを生成することです。現在のドキュメントに基づくと、FOG YML で構成されているため、複数のバケットを持つ方法は見当たりません。この FOG_DIRECTORY をユーザー属性に基づいて動的に設定するための代替手段をお願いしたいと思います。

動的フォルダーを管理する方法があることは知っていますが、ユーザーごとに専用のバケットが必要なため、これは機能しません。

前もって感謝します!

4

1 に答える 1

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 を動的にしたい場合は、carrierwave 構成クラスが正しく動作するように proc をラップする必要があります。

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 関数を変更します。

ユーザーごとのバケットではなく、開発で固定バケットが必要な場合は、条件付きロジックを追加できます。

また、このブログ投稿では、別のアプローチについて概説しています。

于 2012-10-06T05:04:28.197 に答える