2017-12-13 3 views
0

shrineを使ってs3にファイルをアップロードすることができましたが、それぞれの写真を所有するアルバムに従って別のフォルダにアップロードしようとしています。shrineの宝石を使ってs3の別のフォルダに画像をアップロードする

私は名前のバケット考えてみましょう:アルバムに

アップロード画像:abcをアルバムに画像をアップロードabc/family/...

familyはに画像をアップロードする必要がありabc/friends/...

friendsはに画像をアップロードする必要があります

イニシャライザファイルでShrine.storagesに実行する方法が見つかりませんでした。

私はそれを行う方法は、何とかdefault_storagedynamic_storageプラグインを使用していると思いますが、私はまだそれをやり遂げませんでした。

提案/解決策

どうもありがとう:)

関係: Album has_many :photos Photo belongs_to :album

Photoクラス神社ためimage_dataフィールドがあります。

初期化子での私のコード:(基本的なもの)

s3_options = { 
    access_key_id:  ENV["S3_KEY"], 
    secret_access_key: ENV["S3_SECRET"], 
    region:   ENV["S3_REGION"], 
    bucket:   ENV["S3_BUCKET"], 
} 

Shrine.storages = { 
    cache: Shrine::Storage::S3.new(prefix: "cache", **s3_options), 
    store: Shrine::Storage::S3.new(prefix: "store", **s3_options), 
} 

EDIT:

私は名前のプラグインがあり判明:pretty_location立派フォルダ構造が追加されますが、そのない、まさに私バケツの下に/Photo/:photo_id/image/:image_nameを追加しますが、代わりにアルバム名が必要です。

答えて

1

私はそれをしました!

ImageUploaderファイルにgenerate_locationをオーバーライドすること:あなたが他のフォルダをしたい場合は、「storageは」あなたがShrine.storagesで下prefixを変更する必要が:bucket_name/storage/:album_name/:file_name

class ImageUploader < Shrine 
    def generate_location(io, context = {}) 
    album_name = context[:record].album_name if context[:record].album 
    name = super # the default unique identifier 

    [album_name, name].compact.join("/") 
    end 
end 

これはにファイルをアップロードしますイニシャライザファイル

field_name(私の場合はalbum_name.parameterize)にparameterizeを使用して、パスに空白や不要な文字がないようにしてください。

答えを探している人は誰でも!それは私のために働いたthats、お楽しみください。

他の作業/より良い解決策がある場合は、同様に投稿してください。ありがとう。

関連する問題