0

私のGrailsアプリには、次のコントローラーとアクションがあります

class FestivalController {

  def show() {
    [festival: Festival.get(params.id)]
  }
}

次のすべての URL をこのコントローラーにマップしたい

/festival/show/1
/festival/show/1/glastonbury
/1/music/glastonbury

ここでglastonbury、 とmusicはそれぞれ祭りの名前と種類です。フェスティバルを識別するために実際に必要なのは ID (1) のみであるため、SEO と (URL の) 読みやすさの理由から、名前とタイプが URL に含まれていることに注意してください。

次の URL マッピングを使用して、これらの異なる URL をサポートしようとしました。

// this supports the 3rd mapping above
name showFestival: "/$id/$type?/$name?" {
    controller = "festival"
    action = "show"
}

// this supports the 1st mapping above
"/$controller/$action?/$id?/$name?"{
    constraints {           
    }
}

これらは 1 番目と 3 番目の URL マッピングをサポートしていますが、2 番目を試してみると

/festival/show/1/glastonbury

うまくいきません。理想的には、Grails が常に次の形式の URL を生成するようにしたいと考えています。

/1/music/glastonbury

g.createLinkまたはを使用する場合g.link、次の URL もこのアクションにマップする必要があります (歴史的な理由から)。

/festival/show/1
/festival/show/1/glastonbury
4

1 に答える 1

3

他のマッピング規則を見ないと、何が関連して何がそうでないかを知るのは難しいです...あなたが見ている動作は、私がしばらく前にソースから抽出した通常の優先順位規則と矛盾しています同じ着信 URI に適用できます。勝つのは次のものです。

  1. 2 つのワイルドカード (**または$var**) が少ない、または両方が等しい場合
  2. 単一のワイルドカード (*または$var) が少ない、または両方が等しい場合
  3. より多くの非ワイルドカード パス セグメント、または両方が等しい場合
  4. 一番左のワイルドカード ( /foo/*/bazBeats /foo/bar/*)、または両方の左端のワイルドカードが同じ場所にある場合
  5. 多い方constraints

これらの規則により、/festival/show/1/glastonburyは 2 番目のマッピングのみに一致するため、正しく機能する/festival/show/1はずですが、両方に一致するため、/$id/$type/$name(より少ないワイルドカード) によって選択され、[controller:'festival', action:'show', id:'festival', type:'show', name:'1'].

明示的なルールを追加すると、このマッピングと 1 つのマッピングの両方に一致"/festival/$action?/$id?/$name?"(controller:'festival')するように問題が修正されますが、明示的なマッピングにはワイルドカード以外のパス セグメントが多く含まれます (1 対なし)。/festival/show/1/id/type/name/festival/...

于 2012-08-31T11:45:43.307 に答える