LoginSignup
1
0

More than 5 years have passed since last update.

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

Posted at

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指定した意味はなに!!

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0