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
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指定した意味はなに!!
まあー、しかし、使いやすいしパーフォマンス気にしないであれば使ってもいいじゃないて感じかな
Author And Source
この問題について(Rails#Carrierwaveで、uuidを使うことに遭遇した問題), 我々は、より多くの情報をここで見つけました https://qiita.com/kingno21/items/b9e68b8ed01430b0f291著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .