0

Radiant CMSを使用する Rails サイトに取り組んでおり、このリンクの最初の方法に従ってステートフル ナビゲーションを構築しています。

各ナビゲーション リンクのアクティブな状態を表示するかどうかを判断するために、正規表現で URL を照合しています。/communications/例として、Radiant URL 用と用の 2 つのサンプル ナビゲーション要素を次に示します/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プレス リリースの場合、ナビゲーション アイテムは適切に「選択された」クラスを取得し、コミュニケーション ナビゲーション アイテムは選択されていません。ただし、通信の正規表現は正しく機能していないようです。URL が/communications/どちらの要素にも「選択された」クラスがない場合 (したがって、正規表現は一致しないに違いありません)。しかし、私はテストしました

>> "/communications/".match(/communications\/$/)
=> #<MatchData:0x333a4>

ご覧のとおり、正規表現は正常に機能しているようです。何が原因でしょうか?

TL;DR : Ruby シェルでは"/communications/"一致しますが、Radiant ナビゲーションのコンテキストでは一致しません。/communications\/$/何が起きてる?

4

1 に答える 1

1

Radiant の wikiから/、正規表現の前後に 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 正規表現は、start( ) と end of line( $) だけでなく、start( \A) と end of string( )の両方のシンボルがあるという点で興味深いもの\Zです。\Aそのため、正規表現でandを使用している人を時々見かけます\Z

于 2010-10-11T20:06:08.597 に答える