私は以前のすべての解決策を試しましたが、うまく機能しません...しかし、私はこの解決策を作成し、すべてのスタイルで機能します
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_update_file_name = true
オブジェクト呼び出しごとに1回設定すると、レコードが更新されます。
たとえば、クラス名は「アバター」です。
avatar = new Avatars
#... upload and work with files
avatar.avatar_update_file_name = true
avatar.save!
これにより、ファイルの名前を変更するチャームが呼び出されます。
注:この「before_save」は使用できますが、問題は、ペーパークリップがファイルシステムにこのファイルを作成しない可能性があることです。
これがお役に立てば幸いです