3

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

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

所以显示 id 为 2 的书的相对 URL 是/book/show/2. 为了向 id 为 5 的作者展示它是/author/show/5. AuthorBook类都有一个属性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),最简单的方法是什么?

4

2 回答 2

1

大学教师,

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

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

这将为所有请求添加额外的可选参数。如果您只想为AuthorBook控制器执行此操作,那么您应该像这样修改 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”之类的 URL 以及仅“/author/show/10”,您可以通过params.name从 show 方法访问name参数。

于 2012-05-08T22:55:08.560 回答
0

我还没有尝试过,但是你能不能尝试添加另一个规则:

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

那么您将能够在控制器参数中同时获取 id 和 name

def show(id, name) {

}
于 2012-05-08T13:45:28.517 回答