Rails, Radiant и Regex - PullRequest
       4

Rails, Radiant и Regex

0 голосов
/ 11 октября 2010

Я работаю на сайте Rails, который использует Radiant CMS и строю навигацию с отслеживанием состояния в соответствии с первым методом в по этой ссылке .

Я сопоставляю URL-адрес в регулярных выражениях, чтобы определить, показывать или нет активное состояние каждой навигационной ссылки. Например, вот два примера элементов навигации: один для Radiant URL /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/" соответствует /communications\/$/ в оболочке Ruby, но не в контексте навигации Radiant. Что здесь происходит?

1 Ответ

1 голос
/ 12 октября 2010

Из вики Radiant , похоже, вам не нужно добавлять / s вокруг ваших регулярных выражений или бежать / s. Попробуйте:

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

То, что происходит за кадром , заключается в том, что Radiant вызывает Regex.new в строке в matches, поэтому регулярное выражение, которое вы пытались найти ранее, было следующим:

 Regexp.new '/communications\/$/'
# => /\/communications\/$\// 

что означает «косая черта в конце строки», и я действительно сомневаюсь, что вы хотите.

Регулярные выражения Ruby интересны тем, что есть символы как для начала (^) и конца строки ($), так и для начала (\A) и конца строки (\Z). Вот почему иногда вы видите людей, использующих \A и \Z в своих регулярных выражениях.

...