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

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

因此显示ID为2的书的相对URL是/book/show/2。为了显示ID为5的作者,它是/author/show/5AuthorBook类都具有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/

    10-14 09:38