Carreirwave - 如何直接从保存的文件名创建版本名称

Carreirwave - How to have the version name created directly from the saved filename

我正在为已上传到我的应用程序的文件创建缩略图。图像名称中有一个时间戳代码。当我 运行 recreate_versions 生成的缩略图也有时间戳,但它使用当前时间戳,这使得缩略图名称与原始文件名不同。

所以我认为解决方法是为缩略图设置一个自定义文件名。基本上有'thumb_' + 'original filename'.

   version :thumb do
     process :resize_to_limit => [110, nil]

     def full_filename(for_file = model.image_value.file)
     'thumb_' + File.basename(model.image_value.path).to_s
     end
   end

  def filename(for_file = model.image_value.file)
   "#{model.id}" + "-v#{timestamp}" + "-" + "#{model.name}" + ".png" if original_filename.present?
  end

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

这似乎是一个简单的修复,但出于某种原因,当我 运行 recreate_versions 生成缩略图时,其中包含当前时间戳,而不是原始文件名中的时间戳。据我了解,它应该获取存储在数据库中的原始文件名的值,并将其添加到 'thumb_' 的末尾。但不知何故,它改变了名称中的时间戳。

stored filename                      =       1-v1474175808-model-name.png
Item.find(1).image_value_url(:thumb) = thumb_1-v1474175808-model-name.png #this works correctly and looks for the correct filename
thumb filename saved                 = thumb_1-v1472111618-model-name.png #thumb saved is different. For some reason has a different timestamp in name

我想也许 def full_filename 不是 运行,但如果我将其更改为其他内容,保存的缩略图文件名将更改为 def full_filename.

中的内容

不确定这里发生了什么。希望有人可以提供帮助。如果它看起来应该有效,请告诉我,至少这会澄清它可能是我没有看到的东西。

我不明白你为什么要使用 instance_variable_getset。为什么不直接使用 Itemcreated_at?那就永远不会变了。

def timestamp      
  model.created_at
end

最终不得不使用生成的 url 并在 url 上使用 slice! 以仅保留图像名称。

   version :thumb do
     process :resize_to_limit => [110, nil]

    def full_filename(for_file = model.image_value.file)
      raw_file_name = model.image_value.slice!(0..65)
     'thumb_' + raw_file_name
     end

  end