Rails#Carrierwaveで、uuidを使うことに遭遇した問題


UUIDをつける


def filename
    "#{secure_token}.#{file.extension}" if original_filename.present?
end

private 
def secure_token
    var = :"@#{mounted_as}_secure_token"
    model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
end  

このように、ファイル名をUUIDに置き換えることが可能になる

このプロセスはupdateが走ってるときにファイル名を生成する段階で走る

つまり、version生成するときにファイルはすでにUUIDになっている

def full_filename(for_file)
    for_file # 名前がuuid.extensionになっている
end

既存のuploaderを後で、recreate_versions!したい!!!!

Lineのimage mapperは名前を200に制限かけている、200ぐらい余裕だろうと思いきやpull req出した時点でバグ報告受けた、ファイル名の長さが200超え...

なので、後でUUIDにしようと話がまとまり、実際に実装
悪夢の始まり!!

実装上、既存のファイルは問題なく動くがrecreate_versionsを走らせると、必要なファイルが生成されない

def full_filename(for_file)
    [version_name, super(for_file)].compact.join('_')
end

superと同じコードでもダメ

原因が、filenameがもう一回呼ばれるから!!!

まあー呼ばれるんだったら全部更新してくれと思うが

content.url # で、ファイル名がかわらない
content.version.url # で、uuid.extensionが生成される。まじか!!!

line image mapperは
image.url
image.url/240
image.url/1040
みたいな、urlをほしいがるから
image.urlはファイル名のまま
image.version_240はuuidのpathになっている!!!

つまり、既存のファイルでrecreateをしたい場合は

def filename; end

をコメントアウトしないといけない... 何これ!!!

不満その2

重い!!!

一番理解できないのが

content.version.url

を呼ぼうと思っても、全バージョンを舐め回す
なんでやん、version指定した意味はなに!!

まあー、しかし、使いやすいしパーフォマンス気にしないであれば使ってもいいじゃないて感じかな