我正在使用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
答案 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
这对我有用,并消除了递归错误问题。