在Grails URL中包含名称

时间:2012-05-08 09:08:41

标签: grails groovy url-rewriting seo

在我的Grails应用中,我有几个域类,比如AuthorBook。我正在使用默认的URL映射:

static mappings = {
  "/$controller/$action?/$id?"{
    constraints {
      // apply constraints here
    }
  }
}

因此,显示ID为2的图书的相对网址为/book/show/2。要向作者显示id为5,/author/show/5AuthorBook类都有name属性,但不保证这是唯一的。

出于搜索引擎优化的原因,我想在这些网址中加入此名称,例如更改网址以向/book/show/2/the+davinci+code显示图书,并将网址更改为/author/show/5/dan+brown

为了防止破坏我网页的任何现有(外部)链接,我最好支持这两种格式,以便以下任何一种方式都会显示Dan Brown的页面

  • /author/show/5
  • /author/show/5/dan+brown

我最简单的方法是从现在的位置(仅限ID的网址)到我想去的地方(支持ID和名称的网址)?

2 个答案:

答案 0 :(得分:1)

唐,

你有两个选择。首先,如果你不打算在你的逻辑中使用name(这似乎是一个选项,因为你已经拥有唯一的id),那么你可以通过以下方式修改url映射:

static mappings = {
  "/$controller/$action?/$id?/$extra?"{
    constraints {
      // apply constraints here
    }
  }
}

这将为所有请求添加额外的可选参数。如果您只想为作者预订控制器执行此操作,那么您应该像这样修改您的UrlMappings.groovy

static mappings = {
    "/author/show/$id?/$name?" (controller:"author", action: "show")
    "/book/show/$id?/$name?" (controller:"book", action: "show")
    "/$controller/$action?/$id?" {
          constraints {
          // apply constraints here
          }
    }
}

前两个规则将匹配“/ author / show / 10 / dan + brown”等网址以及“/ author / show / 10”,您可以访问show中的 name 参数方法来自 params.name

答案 1 :(得分:0)

我还没试过,但是,你可以尝试添加另一条规则:

"/author/show/$id/$name"{
    constraints {
        controller='author'
        action='show'
    }
}

然后您将能够在控制器参数中获取id和名称

def show(id, name) {

}