在我的 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 中包含此名称,例如将显示书籍的 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
}
}
}
这将为所有请求添加额外的可选参数。如果你只想为 Author 和 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”这样的 url,您可以从 show 访问 name 参数通过 params.name 的方法。
关于grails - 在 Grails URL 中包含名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10495703/