在我的Grails应用中,我有几个域类,例如Author
和Book
。我正在使用默认的URL映射:
static mappings = {
"/$controller/$action?/$id?"{
constraints {
// apply constraints here
}
}
}
因此显示ID为2的书的相对URL是
/book/show/2
。为了显示ID为5的作者,它是/author/show/5
。 Author
和Book
类都具有name
属性,但这不能保证是唯一的。出于SEO的原因,我想在这些网址中添加此名称,例如将显示书的URL更改为
/book/show/2/the+davinci+code
,将显示书的URL更改为/author/show/5/dan+brown
。为避免破坏到我页面的任何现有(外部)链接,理想情况下,我希望同时支持这两种格式,以便以下任何一种都能显示Dan Brown的页面
/author/show/5
/author/show/5/dan+brown
从我现在所在的位置(仅具有ID的URL)到我想要的位置(也支持ID和名称的URL)对我来说,最简单的方法是什么?
最佳答案
唐
您有两个选择。首先,如果您根本不打算在逻辑中使用名称(这似乎是一个选择,因为您已经具有唯一的ID),则可以按以下方式修改url映射:
static mappings = {
"/$controller/$action?/$id?/$extra?"{
constraints {
// apply constraints here
}
}
}
这将为所有请求添加额外的可选参数。如果只想对作者和 Book Controller 执行此操作,则应像这样修改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方法通过params.name访问name参数。
关于grails - 在Grails网址中包含名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10495703/