2

ファイルを Amazon s3 に直接アップロードするために使用している Carrier wave Direct のアップロード パスを設定したいと考えています。app/uploaders/myuploader.rb では、

def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end

これを変更して、パスが
「uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{User.name}」のようになるようにします。 「uploads/Users/avatar/michael_jordan/..」
のようなものになります。 ここで、User はアップローダーが搭載されているモデルです。

github ( https://github.com/dwilkie/carrierwave_direct ) で Carrier wave Gem のソース コードを確認しましたが、アクティブなモデル オブジェクトからアップローダに値を渡してアップロードを作成する方法がわかりませんでした。パス (Amazon s3 のキー)。これを行う方法はありますか?

ありがとう!
ドラゴン

4

4 に答える 4

5

わかりました.1か月後、私は同じ問題に取り組むことを余儀なくされ、今回はそれを釘付けにしました.同じ問題を抱えている他の人を助けるために、私の解決策をここに投稿します.1)空の文字列を返すようにstore_dirをオーバーライドします.

def store_dir
 ""
end

2)コントローラーに到達し、好みのキーをアップローダーオブジェクトの「キー」属性に割り当てます。

  @uploader = @player.avatar 
  @uploader.key =@player.name +"/\${filename}"
  #say if player name in is jordan and the filename is jordan.jpg.
  #the uplaod path  now will be   
  #http://bucketname/jordan/jordan.jpg.

ここで、player はモデル オブジェクト、avatar はアップローダーがマウントされるプロパティで、キーは playername/filename として設定されます。

それは私が探していたものでした:)

于 2012-11-15T20:24:44.257 に答える
2

model.nameうまくいかない場合は、#read_attributeメソッドを使用して名前フィールドに直接アクセスしてみください

したがって、store_dirメソッドは次のようになります。

def store_dir
  uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.send(:name)}
end

しかし、私model.nameはうまくいくはずだと信じています

于 2012-10-08T21:19:39.237 に答える
0

最初に提供された解決策はうまくいきませんでした。これを一日中トラブルシューティングした後、キーを動的に作成するコードをチェックアウトしました。

https://github.com/dwilkie/carrierwave_direct/blob/master/lib/carrierwave_direct/uploader.rb

# as defined in carrierwave_direct/uploader.rb
def key
  return @key if @key.present?
  if present?
    self.key = URI.parse(URI.encode(url, " []+()")).path[1 .. -1] # explicitly set key
  else
    @key = "#{store_dir}/#{guid}/#{FILENAME_WILDCARD}"
  end
  @key
end

おいおい。このメソッドをオーバーライドしようとするのではなく、store_dir メソッドと guid メソッドをアップローダで直接オーバーライドしました。

def store_dir
  "#{model.group.id}/photos"
end

def guid
  Time.now.utc.strftime("%Y-%m-%d-%H%M%S")
end

これが誰かに役立つことを願っています。

于 2014-01-06T04:41:14.303 に答える