Ruby Carrierwave文件名方法在将文件上载到s3时创建问题

Ruby Carrierwave文件名方法在将文件上载到s3时创建问题,ruby,ruby-on-rails-3,amazon-s3,carrierwave,Ruby,Ruby On Rails 3,Amazon S3,Carrierwave,我有一个ImageUploader,我想把一个图像上传到S3。 另外,我想使用filename方法更改文件名。 代码如下: class ImageUploader < CarrierWave::Uploader::Base storage :fog def store_dir "images" end def filename "#{model.id}_#{SecureRandom.urlsafe_base64(5)}.#{file.extension}

我有一个
ImageUploader
,我想把一个图像上传到S3。 另外,我想使用
filename
方法更改文件名。 代码如下:

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
class ImageUploader
第一次保存图像时,它会获得正确的文件名,例如
1_23434.png
,但当我从控制台获取模型对象时,它会返回不同的图像名


这里有人能帮我吗?当我不使用fog时,它可以正常工作。

问题在于
文件名方法。每次调用时,它都返回不同的值。这是因为
SecureRandom.urlsafe\u base64(5)
生成一个随机字符串(并且它不会被缓存)<代码>文件名
也用于在引擎盖下通过CarrierWave构建路径相关字符串。这就是为什么从控制台运行
object.image.filename
时会得到不同的图像名称

您正在寻找的方法是
image\u identifier
(其中
image
前缀位于装载上载程序的名称下)

您可以尝试以下方法:

object.public_send("#{object.image.mounted_as}_identifier") || generate_unique_name
其中,
generate\u unique\u name
是您当前的
filename
实现。另一种方法是将散列存储在模型本身中以备将来使用


另外,关于的官方wiki页面可能对您有用。

问题在于
文件名方法。每次调用时,它都返回不同的值。这是因为
SecureRandom.urlsafe\u base64(5)
生成一个随机字符串(并且它不会被缓存)<代码>文件名
也用于在引擎盖下通过CarrierWave构建路径相关字符串。这就是为什么从控制台运行
object.image.filename
时会得到不同的图像名称

您正在寻找的方法是
image\u identifier
(其中
image
前缀位于装载上载程序的名称下)

您可以尝试以下方法:

object.public_send("#{object.image.mounted_as}_identifier") || generate_unique_name
其中,
generate\u unique\u name
是您当前的
filename
实现。另一种方法是将散列存储在模型本身中以备将来使用


另外,关于的官方wiki页面可能对您有用。

为什么使用
如果原始文件名
条件位于
文件名
方法?文件名返回什么?为什么使用
如果原始文件名
条件位于
文件名
方法?文件名返回什么?