Rails, Radiant и Regex
-
29-09-2019 - |
Вопрос
Я работаю на сайте Rails, который использует Сияющий CMS и строю государственную навигацию в соответствии с первым методом в эта ссылка.
Я сопоставляю URL -адрес по регулярным выражениям, чтобы определить, показывать ли активное состояние каждой навигационной ссылки. В качестве примера, вот два образца навигационных элементов, один для лучистого 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
Пресс выпускает элемент NAV соответствующим образом получен «выбранный» класс, а элемент NAV Communications не выбран. Тем не менее, регулярное выражение связи, похоже, не функционирует правильно, так как, когда URL /communications/
Ни один из элементов не имеет класса «выбранного» (поэтому регулярность должна соответствовать). Тем не менее, я проверил
>> "/communications/".match(/communications\/$/)
=> #<MatchData:0x333a4>
В IRB, и, как вы можете видеть, регулярное выражение, кажется, работает нормально. Что это может вызвать?
TL; доктор: "/communications/"
Матчи /communications\/$/
в рубиновой оболочке, но не в контексте сияющей навигации. Что тут происходит?
Решение
От Вики Радианта, похоже, вам не нужно добавлять /
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>
Что происходит за кулисами это сияющие звонки Regex.new
на строке в matches
, так что в форме, которую вы пытались соответствовать раньше, была этой:
Regexp.new '/communications\/$/'
# => /\/communications\/$\//
Что переводится как «Слэш-сглаша конец строки», что, я действительно сомневаюсь, это то, что вы хотите.
Ruby Regexs интересны в том, что есть символы для оба начала (^
) и конец линии ($
) а также начать (\A
) и конец строки (\Z
) Вот почему иногда вы увидите, как люди используют \A
и \Z
в их регулярных выборах.