Rails,Radiant和Regex

时间:2010-10-11 18:18:40

标签: ruby-on-rails ruby regex radiant

我正在使用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导航的上下文。这是怎么回事?

1 个答案:

答案 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