多个Grails的URL映射(multiple grails url mappings)

2019-09-22 00:07发布

在我的Grails应用程序,我有以下控制器和行动

class FestivalController {

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

我想所有的下列URL映射到该控制器

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

其中, glastonburymusic的名称,分别节日的类型。 只有ID(1)实际需要来识别节的通知,所以这个名字和类型都包含在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总是产生以下形式的网址:

/1/music/glastonbury

当我使用g.createLinkg.link ,但我也想下面的网址映射到这个动作(由于历史原因):

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

Answer 1:

没有看到你的其他映射规则很难知道什么是有意义的,哪些是不...你看到的行为与通常的优先级规则,这是我不一致从源中提取的,而背部和说,当两个映射可以适用于同一传入URI中,赢得一个是有一个:

  1. 更少双通配符( **$var** ),或者如果两者相等则
  2. 更少的单通配符( *$var ),或者如果两者相等则
  3. 多个非通配符路径段,或者如果两者相等然后
  4. 最左侧的通配符( /foo/*/baz/foo/bar/* ),或者两者各有最左边的通配符在同一个地方,然后
  5. 更多的一个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比无)。



文章来源: multiple grails url mappings