我正在尝试使用carrierwave
在上传的文件上写新文件名,我在app/uploaders/media_uploader.rb
上使用了两种方法
def filename
"#{secure_token}.#{file.extension}"
end
protected
def secure_token
var = :"@#{mounted_as}_secure_token"
model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
end
#model/user.rb
mount_uploader :avatar, MediaUploader
这在上传新文件或更新文件时效果很好,但问题是当我使用其他属性时,例如使用其他形式更新我的name
,email
或bio
然后文件更新其他属性后,名称不断更新,然后文件丢失。
我现在能做什么?
答案 0 :(得分:0)
您可以通过调用file.cache_stored_file!
重新保存它,我发现了这个here。我的上传者路径取决于updated_at
,因此我在模型中执行了以下操作:
我的上传器
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}/#{model.updated_at.to_i}"
end
我的模特
before_update :update_file_path
...
def update_file_path
my_uploader.cache_stored_file! if changed?
end