在我的Grails应用中,我有几个域类,比如Author
和Book
。我正在使用默认的URL映射:
static mappings = {
"/$controller/$action?/$id?"{
constraints {
// apply constraints here
}
}
}
因此,显示ID为2的图书的相对网址为/book/show/2
。要向作者显示id为5,/author/show/5
。 Author
和Book
类都有name
属性,但不保证这是唯一的。
出于搜索引擎优化的原因,我想在这些网址中加入此名称,例如更改网址以向/book/show/2/the+davinci+code
显示图书,并将网址更改为/author/show/5/dan+brown
。
为了防止破坏我网页的任何现有(外部)链接,我最好支持这两种格式,以便以下任何一种方式都会显示Dan Brown的页面
/author/show/5
/author/show/5/dan+brown
我最简单的方法是从现在的位置(仅限ID的网址)到我想去的地方(支持ID和名称的网址)?
答案 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) {
}