在我的Grails应用中,我具有以下 Controller 和操作
class FestivalController {
def show() {
[festival: Festival.get(params.id)]
}
}
我希望将以下所有URL映射到此 Controller
/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 {
}
}
这些支持第一和第三URL映射,但是如果我尝试第二
/festival/show/1/glastonbury
它不起作用。理想情况下,我希望Grails始终生成以下形式的URL:
/1/music/glastonbury
当我使用
g.createLink
或g.link
时,但我也希望以下URL映射到此操作(由于历史原因):/festival/show/1
/festival/show/1/glastonbury
最佳答案
如果不查看其他映射规则,就很难知道什么是相关的,哪些是不相关的。您所看到的行为与通常的优先规则不一致,我将其映射为extracted from the source a while back,并说当两个映射可以应用于同一传入时URI,赢得的是具有以下内容的一个:
**
或$var**
),或者如果两者相等,则*
或$var
),或者如果两者相等,则/foo/*/baz
击败/foo/bar/*
),或者如果两个通配符的最左边的通配符在同一位置,则constraints
的根据这些规则,
/festival/show/1/glastonbury
仅匹配第二个映射,因此应该可以正常工作,但是/festival/show/1
可以匹配第二个映射,因此应由/$id/$type/$name
(较少的通配符)选择,从而生成[controller:'festival', action:'show', id:'festival', type:'show', name:'1']
。为
"/festival/$action?/$id?/$name?"(controller:'festival')
添加显式规则应该可以解决问题,因为/festival/show/1
将同时匹配此映射和/id/type/name
,但是显式/festival/...
映射具有更多的非通配符路径段(1对无)。关于grails - 多个grails网址映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12213095/