我正在调试carrierwave。好有趣。我认为问题归结为:
在carrierwave_direct中,有以下代码:
if record.new_record? && record.send("has_#{attribute}_upload?") && record.key !~ record.send(attribute).key_regexp
#key_regexp代码是这样的:
/\A#{store_dir}\/[a-f\d\-]+\/.+\.(?i)#{extension_regexp}(?-i)\z/
在我调试时评估为:
record.send(attribute).key_regexp
/\Astories\/\/main_images\/[a-f\d\-]+\/.+\.(?i)(jpg|jpeg|gif|png)(?-i)\z/
我的store_dir是这样的:
“故事/#{model.id} / main_images”
我觉得有一个空白的“/”部分因为model.id是nil。
record.key是这样的:
“/故事/ main_imagescache / 20160319-1549-2202-5826 / blueapronimage.jpg”
为什么它目前不匹配?
看起来正则表达式有一个额外的斜杠,我不确定这部分是什么:
[a-f\d\-]+\/.+\.(?i)(jpg|jpeg|gif|png)(?-i)
是a-f,数字或“ - ”之间的任意数量的字母,然后是“/”,然后是任意数量的字母或数字,然后是“。”....
什么是(?i)?
什么是捕获组?
什么是(?-i)?
我认为这是问题所在:
record.key !~ /\Astories/
true
应该是假的。
答案 0 :(得分:0)
看看这个,它解释了它:
[a-f\d\-]+ # Matches a-f, any digit, - (hyphen)
# ^ One or more times (+)
\/ # Matches a /
.+ # Matches any character one or more times
\. # Matches a . (dot)
(?i) # States that anything after this is case-insesitive
# ^ Inline Flag
(jpg|jpeg|gif|png) # Selects file extension
# ^ (either jpg, jpeg, gif, or png)
(?-i) # Removes Inline Flag
这应该解释每个人的所作所为。
另请查看此Live Demo。你的例子确实似乎匹配,也许你的代码的另一部分是不正确的......