2017-10-20 26 views
1

ImageUploaderがあり、S3に画像をアップロードしたいとします。 また、filenameメソッドを使用してファイル名を変更したいと思います。ここ はコードです:ファイルをs3にアップロードする際に問題が発生する

class ImageUploader < CarrierWave::Uploader::Base 
    storage :fog 

    def store_dir 
    "images" 
    end 

    def filename 
    "#{model.id}_#{SecureRandom.urlsafe_base64(5)}.#{file.extension}" if original_filename 
    end 
end 

初めて私は、画像を保存するとき、それは例えば1_23434.png、正しいファイル名を取得しますが、私は、コンソールからモデルオブジェクトを取得するとき、それは別のイメージ名を返します。

私を助けることができる人がいますか?私は霧を使わないとうまくいく。

+0

なぜ 'filename_'メソッドで' if original_filename'条件を使用しますか? –

+0

ファイル名には何が返されますか? –

答えて

0

問題はfilenameメソッドにあります。すべての呼び出しで、別の値を返します。これは、SecureRandom.urlsafe_base64(5)がランダムな文字列を生成するためです(キャッシュされません)。 filenameは、CarrierWaveによってパス関連の文字列を構築するためにフードの下でも使用されます。これは、コンソールからobject.image.filenameを実行するときに、異なるイメージ名を取得する理由です。

あなたが探している方法はimage_identifierです(imageのプレフィックスはあなたのアップローダがマウントされている名前の下にあります)。

あなたが好きなものを試すことができます:generate_unique_nameは、あなたの現在のfilenameの実装です

object.public_send("#{object.image.mounted_as}_identifier") || generate_unique_name 

。もう1つのアプローチは、将来の使用のためにモデル自体にハッシュを格納することです。

また、公式のwikiページcreating random and unique filenamesについてはお役に立ちます。

関連する問題