Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 重新启动后Carrierwave重置_Ruby On Rails_Ruby On Rails 3_Carrierwave - Fatal编程技术网

Ruby on rails 重新启动后Carrierwave重置

Ruby on rails 重新启动后Carrierwave重置,ruby-on-rails,ruby-on-rails-3,carrierwave,Ruby On Rails,Ruby On Rails 3,Carrierwave,应用程序和db(mongodb)服务器昨晚都重新启动了。所有carrierwave上传程序都会返回头像的默认图像,即使这些文件仍然存在 我正在机架空间CDN上使用雾存储。每个用户模型都包含一个avatar\u filename字段。我试着运行user.avatar.recreate\u版本但是,由于为零,该错误将被排除 有没有办法恢复我的图像(它们仍然存在!)并防止这种情况再次发生?我到处找了找,但看起来这不是一个普通的舞会 在我的用户模型中: # Avatar mount_uploader :

应用程序和db(mongodb)服务器昨晚都重新启动了。所有carrierwave上传程序都会返回头像的默认图像,即使这些文件仍然存在

我正在机架空间CDN上使用雾存储。每个用户模型都包含一个
avatar\u filename
字段。我试着运行
user.avatar.recreate\u版本但是,由于为零,该错误将被排除

有没有办法恢复我的图像(它们仍然存在!)并防止这种情况再次发生?我到处找了找,但看起来这不是一个普通的舞会

在我的用户模型中:

# Avatar
mount_uploader :avatar, AvatarUploader
头像播放机:

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
类AvatarUploader:small do 将_调整为_填充(35,35) 结束 def扩展白名单 %w(jpg jpeg png) 结束 def文件名 如果@filename\u已创建 @文件名\u已创建 elsif原始文件名 @name | |=摘要::MD5.hexdigest(File.dirname(当前路径)) @filename_created=“a_35;{timestamp}35;{@name}.#{file.extension}” @文件名\u已创建 结束 结束 def时间戳 var=:“@#{mounted_as}u时间戳” model.instance\u variable\u get(var)或model.instance\u variable\u set(var、Time.now.to\u i) 结束 def作物 如果存在型号crop_x? 将_调整为_限制(600600) 操纵do | img| x=模型。裁剪到 y=模型裁剪y到i w=模型作物w到i h=模型作物h到i 我的作物!(x,y,w,h) 结束 结束 结束 结束
如果图像在那里,您可以使用
user.remote\u avatar\u url=“此化身的url”将其作为远程文件重新加载。

为了避免将来出现这种情况,您必须记住如何处理文件名。每次执行
重新创建\u版本时,都会重新应用该过程。将此代码放在您的上载程序中,以绕过此问题:

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
类AvatarUploader

您可以在下面的wiki文章中找到更多关于这方面的信息:

第一件事优先。当模型有:avatar_文件名字段用于虚拟存储时,为什么要在:avatar字段上调用mount_uploader?第二,您在上传程序中定义了2次文件名-在默认的_url和文件名方法中。我不明白你为什么需要它,这可能也是问题的一部分。@Almaron
avatar\u文件名
是carrierwave/carrierwave\u mongoid在装载上传程序后创建的。默认URL是为尚未上传头像的用户提供一个空白头像。