我正在使用Radiant CMS的Rails网站,并按照 this link中的第一种方法构建状态导航。
我正在匹配正则表达式上的URL,以确定是否显示每个导航链接的活动状态。例如,以下是两个示例导航元素,一个用于Radiant网址/communications/
,另一个用于/communications/press_releases/
:
<r:if_url matches="/communications\/$/"><li class="bottom-border selected">Communications</li></r:if_url>
<r:unless_url matches="/communications\/$/"><li class="bottom-border"><a href="/communications">Communications</a></li></r:unless_url>
<r:if_url matches="/communications\/press_releases/"><li class="bottom-border selected">Press Releases</li></r:if_url>
<r:unless_url matches="/communications\/press_releases/"><li class="bottom-border"><a href="/communications/press_releases">Press Releases</a></li></r:unless_url>
新闻发布页面上的一切正常 - 也就是说,当URL为/communications/press_releases
时,新闻发布导航项会适当地获取“选定”类,并且未选择通讯导航项。但是,Communications正则表达式似乎无法正常运行,因为当URL为/communications/
时,两个元素都没有“selected”类(因此正则表达式必须无法匹配)。但是,我已经测试了
>> "/communications/".match(/communications\/$/)
=> #<MatchData:0x333a4>
在IRB中,正如您所看到的,正则表达式似乎工作正常。可能导致这种情况的原因是什么?
TL; DR :"/communications/"
匹配Ruby shell中的/communications\/$/
,但不匹配Radiant导航的上下文。这是怎么回事?
答案 0 :(得分:1)
从Radiant's wiki开始,您似乎无需在正则表达式周围添加/
或转义/
。尝试:
<r:if_url matches="/communications/$"><li class="bottom-border selected">Communications</li></r:if_url>
<r:unless_url matches="/communications/$"><li class="bottom-border"><a href="/communications">Communications</a></li></r:unless_url>
<r:if_url matches="/communications/press_releases/"><li class="bottom-border selected">Press Releases</li></r:if_url>
<r:unless_url matches="/communications/press_releases/"><li class="bottom-border"><a href="/communications/press_releases">Press Releases</a></li></r:unless_url>
正在发生的事情behind the scenes是Radiant在Regex.new
中的字符串上调用matches
,因此您之前尝试匹配的正则表达式就是这个:
Regexp.new '/communications\/$/'
# => /\/communications\/$\//
这意味着'斜线通信削减行尾斜线',我真的怀疑你想要的是什么。
Ruby Regexs很有趣,因为开始(^
)和行尾($
)以及start(\A
)和字符串结尾({}都有符号{1}})。这就是为什么有时你会看到人们在他们的正则表达式中使用\Z
和\A
。