2013-03-22 12 views
6

appとdb(mongodb)サーバの両方が昨晩再起動されました。ファイルがまだ存在していても、すべてのキャリバーウェーブ搭載アップローダーがアバターのデフォルト画像を返しています。再起動後のキャリア波リセット

私はRackspace CDNでフォグストレージを使用しています。各ユーザーモデルには、avatar_filenameのフィールドが含まれています。私はuser.avatar.recreate_versions!を実行しようとしましたが、nilのためにエラーが出ました。

イメージを復元する方法はありますか(まだ存在しています)、これが再び起こらないようにしますか?私は周りを検索したが、これは一般的なプロムであるように見えない。私のユーザモデルで

# Avatar 
mount_uploader :avatar, AvatarUploader 

AvatarUploader:イメージがありますが、あなたがこれを避けるためにuser.remote_avatar_url = "the url for this avatar"

でリモートファイルとしてそれらを再度アップロードすることができることを考えると

class AvatarUploader < CarrierWave::Uploader::Base 
    include CarrierWave::RMagick 

    storage :fog 

    def default_url 
    "/assets/users/profile-default_#{version_name}.png" 
    end 

    # Large 
    version :large do 
    resize_to_limit(600, 600) 
    end 

    # Small 
    version :small do 
    process :crop 
    resize_to_fill(140, 140) 
    end 

    # Thumbnail 
    version :thumb, :from_version => :small do 
    resize_to_fill(35, 35) 
    end 

    def extension_white_list 
    %w(jpg jpeg png) 
    end 

    def filename 
    if @filename_created 
     @filename_created 
    elsif original_filename 
     @name ||= Digest::MD5.hexdigest(File.dirname(current_path)) 
     @filename_created = "a_#{timestamp}_#{@name}.#{file.extension}" 
     @filename_created 
    end 
    end 

    def timestamp 
    var = :"@#{mounted_as}_timestamp" 
    model.instance_variable_get(var) or model.instance_variable_set(var, Time.now.to_i) 
    end 

    def crop 
    if model.crop_x.present? 
     resize_to_limit(600, 600) 
     manipulate! do |img| 
     x = model.crop_x.to_i 
     y = model.crop_y.to_i 
     w = model.crop_w.to_i 
     h = model.crop_h.to_i 
     img.crop!(x, y, w, h) 
     end 
    end 
    end 
end 
+0

まず物事を最初に。モデルにavatar_filenameフィールドがあります:avatarフィールドにmount_uploaderを呼び出しているのはなぜですか? 第2に、uploaderでファイル名を2回定義しています - default_urlとfilenameメソッドで。それがなぜ必要なのか理解できず、それも問題の一部になる可能性があります。 – Almaron

+0

@Almaron '' avatar_filename''はアップローダをマウントした結果、carrierwave/carrierwave_mongoidによって作成されました。デフォルトのURLはまだアップロードしていないユーザーに空白のアバターを提供することです。 –

答えて

1

将来、ファイル名の処理方法を覚えておく必要があります。このプロセスは、毎回recreate_versions!を実行するたびに再適用されます。これを回避するために、あなたのアップローダーにこのコードを入れてください:

class AvatarUploader < CarrierWave::Uploader::Base 
    def filename 
    if original_filename 
     if model && model.read_attribute(:avatar).present? 
     model.read_attribute(:avatar) 
     else 
     # new filename 
     end 
    end 
    end 
end 

あなたは、次のWikiの記事でこれについての詳細な情報を見つけることができます:https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Create-random-and-unique-filenames-for-all-versioned-files

関連する問題