Ruby on rails 3 回形针-保存前重命名文件

Ruby on rails 3 回形针-保存前重命名文件,ruby-on-rails-3,paperclip,file-rename,Ruby On Rails 3,Paperclip,File Rename,在保存之前,我使用此方法重命名图像: def rename_avatar self.avatar.instance_write :file_name, Time.now.to_i.to_s end before_post_process :rename_avatar 图像按当前时间重命名,但没有添加文件类型,而不是1334487964。jpg仅保存1334487964。 我错过了什么?我想:file_name只包含文件名,而不包含文件类型这就是我解决问题的方法: de

在保存之前,我使用此方法重命名图像:

  def rename_avatar
    self.avatar.instance_write :file_name, Time.now.to_i.to_s
  end

  before_post_process :rename_avatar
图像按当前时间重命名,但没有添加文件类型,而不是1334487964。jpg仅保存1334487964。


我错过了什么?我想:file_name只包含文件名,而不包含文件类型这就是我解决问题的方法:

  def rename_avatar
    #avatar_file_name - important is the first word - avatar - depends on your column in DB table
    extension = File.extname(avatar_file_name).downcase
    self.avatar.instance_write :file_name, "#{Time.now.to_i.to_s}#{extension}"
  end

由于
回形针
建议使用
插值
,因此此链接可以为您提供最佳帮助。

我已经尝试了前面所有的解决方案,但效果不太好。。。 然而,我已经创建了这个解决方案,并且它在所有样式上都与我一起工作

  attr_accessor :avatar_update_file_name
  has_attached_file :avatar,
                    :styles => {
                      :medium => "288x288#",
                      :small => "150x150#",
                      :thumb => "48x48#"
                    },
                    :path => YOUR_PATH + ":style/:basename.:extension",
                    :url => YOUR_PATH + ":style/:filename",
                    preserve_files: true


  process_in_background :avatar, only_process: [:medium, :small, :thumb, :original]
  after_save :rename_avatars

  def rename_avatars
    if self.avatar_update_file_name == true
      new_file_hash = "#{SecureRandom.urlsafe_base64}"
      new_file_name = ""
      (self.avatar.styles.keys+[:original]).each do |style|
        path = avatar.path(style)
        if(File.file?(path))
        File.chmod(0777, File.dirname(path))
        new_file_name = "#{new_file_hash}.#{extension}"
        FileUtils.move(path, File.join(File.dirname(path), new_file_name))
        end
      end
      self.avatar_update_file_name = false
      self.avatar_file_name = new_file_name
      self.save!
    end
  end
每次保存对象并在每次对象调用中设置
avatar\u update\u file\u name=true
一次,它都会循环显示您的样式,并更新您的记录

例如,你的类名是“阿凡达”

这将调用“使文件重命名”咒语

注意:您可以在“保存前”使用此选项,但问题是回形针可能无法在文件系统上创建此文件


希望这将有助于

此解决方案正常工作,除非您正在编辑记录。在我的例子中,我有3个附件,photo,certificate1,certificate2,如果我更改了照片,我必须再次上传证书,因为当例程转到回调“before_post”时,它会在DB上记录一个新的不可抗拒的文件名。你有解决这个问题的办法吗?谢谢!;)@drmwndr,参加派对已经太迟了,但这可以帮助你解决问题。
avatar = new Avatars
#... upload and work with files
avatar.avatar_update_file_name = true
avatar.save!