在我的Grails应用中,我具有以下 Controller 和操作

class FestivalController {

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

我希望将以下所有URL映射到此 Controller
/festival/show/1
/festival/show/1/glastonbury
/1/music/glastonbury

其中glastonburymusic分别是节日的名称和类型。请注意,实际上仅需要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.createLinkg.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/

    10-08 22:07
    查看更多