CarrierWave:在store_dir中使用文件名

时间:2013-06-16 13:26:13

标签: ruby carrierwave

我正在使用CarrierWave将图像保存到S3。在上传之前,图像被重命名为随机字符串。现在为了更快的查找,我想把文件放在以文件名的两个首字母命名的目录中。但是这样做,Rails用stack level too deep中止。

所以我假设调用#{model.image[0, 2]会导致无限递归。有没有办法只将文件名作为字符串访问?或者更简单的解决方案?

这是上传者:

class ImageUploader < CarrierWave::Uploader::Base

  storage :fog

  def store_dir
    "images/#{model.image[0, 2]}/"
  end

  def filename
    "#{secure_token}.#{file.extension}" if original_filename.present?
  end

  protected
  def secure_token
    var = :"@#{mounted_as}_secure_token"
    model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(8))
  end

end

2 个答案:

答案 0 :(得分:0)

尝试:file_identifier方法

class ImageUploader < CarrierWave::Uploader::Base
  ...

  def store_dir
    "images/#{model.file_identifier[0, 2]}/#{model.id}"
  end

  ...

end

答案 1 :(得分:0)

简单的答案是在filename模型中添加代理属性,例如Image,并使用read_attribute访问该属性:

class Image < ApplicationRecord
  mount_uploader :image, ImageUploader

  def filename
    read_attribute(:image)
  end
  ...
end

然后在ImageUploader#store_dir method引用代理属性filename

  def store_dir
    "images/#{model.filename}"
  end

这对我有用,并消除了递归错误问题。