4

私は昨日これを少しいじって、惨めに失敗しました。変換したい:

"/$controller/$action?/$id?"

#in psudo
"/$controller/$id?/$action?"
#ideal regex
"\/(\w+)(\/\d+)?(\/\w+)?" 

最も明白な方法は失敗しました"/$controller/$action?/$id?"

正規表現を記述してそれを行うことはできますが、真の正規表現を使用する方法を見つけるのに問題があり(RegexUrlMappingを見つけましたが、使用方法を見つけることができませんでした)、グループを割り当てる方法に関するドキュメントも見つかりません。変数。

私の質問は2つの部分です:

  1. 真の正規表現を使用してURLリソースを定義する方法。
  2. 「グループ」を変数にバインドする方法。言い換えると、正規表現を定義する場合、それを$ controller、$ id、$actionなどの変数にバインドするにはどうすればよいですか。

また、.json表記/user/id.jsonをサポートできるようにしたいと思います


私が試した他のことは、うまくいくと思いました:

"/$controller$id?$action?"{
        constraints {
            controller(matches:/\w+/)
            id(matches:/\/\d+/)
            action(matches:/\/\w+/)
        }
    }

また試した:

"/$controller/$id?/$action?"{
        constraints {
            controller(matches:/\w+/)
            id(matches:/\d+/)
            action(matches:/\w+/)
        }
    }
4

1 に答える 1

2

これに対処するGrailsの方法は、設定することです

grails.mime.file.extensions = true

Config.groovy。これにより、Grails は URL マッピングを適用する前にファイル拡張子を取り除きますが、withFormat

def someAction() {
  withFormat {
    json {
      render ([message:"hello"] as JSON)
    }
    xml {
      render(contentType:'text/xml') {
        //...
      }
    }
  }

このためには、次の URL マッピングが必要です。"$controller/$id?/$action?"

URL マッピングで希望する方法で正規表現を使用する方法はわかりませんが、実行時に評価されるパラメーター値のクロージャーを指定できるという事実を使用して、前方マッピングを機能させることができます。その他のパラメーター:

"$controller/$a?/$b?" {
  action = { params.b ?: params.a }
  id = { params.b ? params.a : null }
}

これは、「bが設定されている場合は、それをアクションaとしてid使用し、それ以外の場合aはアクションとして使用し、に設定idnullます」. しかし、これは適切な逆マッピングを提供しません。つまり、意味のあるcreateLink(controller:'foo', action:'bar', id:1)ものは何も生成しません。使用する必要があります。createLink(controller:'foo', params:[a:1, b:'bar'])

編集

あなたが試すことができる3番目の可能性は、

"/$controller/$id/$action"{
    constraints {
        controller(matches:/\w+/)
        id(matches:/\d+/)
        action(matches:/\w+/)
    }
}

補完的なマッピング

"/$controller/$action?"{
    constraints {
        controller(matches:/\w+/)
        action(matches:/(?!\d+$)\w+/)
    }
}

否定先読みを使用して、2 つのマッピングが互いに素であることを確認します。

于 2013-02-21T16:50:52.457 に答える