Rails:使用模型更新每个更新的carrierwave文件名

时间:2018-03-18 05:26:07

标签: ruby-on-rails ruby carrierwave

我正在尝试使用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

这在上传新文件或更新文件时效果很好,但问题是当我使用其他属性时,例如使用其他形式更新我的nameemailbio然后文件更新其他属性后,名称不断更新,然后文件丢失。

我现在能做什么?

1 个答案:

答案 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