我昨天对此有点乱,并且悲惨地失败了。我想转换:
"/$controller/$action?/$id?"
到
#in psudo
"/$controller/$id?/$action?"
#ideal regex
"\/(\w+)(\/\d+)?(\/\w+)?"
最明显的方法是失败"/$controller/$action?/$id?"
我可以写正则表达式来做,但我找不到使用真正的正则表达式的方法(我发现RegexUrlMapping但无法找到如何使用它),也无法找到文档关于如何将一个组分配给一个变量。
我的问题是两部分:
我还希望能够支持.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+/)
}
}
答案 0 :(得分: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') {
//...
}
}
}
为此,您只需要"$controller/$id?/$action?"
我不知道在URL映射中以任何方式使用正则表达式的方法,但您可以使用以下事实获得正向映射:您可以为在以下位置评估的参数值指定闭包运行时可以访问其他参数:
"$controller/$a?/$b?" {
action = { params.b ?: params.a }
id = { params.b ? params.a : null }
}
表示"如果设置了b
,则将其用作操作,将a
用作id
,否则使用a
作为操作并设置{ {1}}到id
"。但是这不会给你一个很好的反向映射,即null
不会生成任何合理的东西,你必须使用createLink(controller:'foo', action:'bar', id:1)
修改强>
你可以尝试的第三种可能性是结合
createLink(controller:'foo', params:[a:1, b:'bar'])
使用补充
进行映射"/$controller/$id/$action"{
constraints {
controller(matches:/\w+/)
id(matches:/\d+/)
action(matches:/\w+/)
}
}
使用负前瞻来确保两个映射是不相交的。