2012-05-08 44 views
3

在我的Grails应用程序中,我有几个域类,如AuthorBook。我使用的是默认的URL映射:将名称包含在Grails URL中

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

所以相对URL以显示书的ID 2 /book/show/2。要向id 5显示作者是/author/show/5AuthorBook类都具有name属性,但这并不保证是唯一的。

对于搜索引擎优化的原因,我想在这些网址中包含这个名字,例如:更改URL以显示书籍/book/show/2/the+davinci+code以及将作者显示为/author/show/5/dan+brown的URL。

为了防止破坏任何现有的(外部)链接到我的网页,我会非常愿意支持这两种格式,使得下面的任一会告诉丹·布朗的页面

  • /author/show/5
  • /author/show/5/dan+brown

什么是我从现在所在的位置(仅带有ID的URL)到我想要的位置(支持ID和名称的URL)的最简单方式?

回答

0

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

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

,那么你就可以得到你的控制器都ID和名称PARAMS

def show(id, name) { 

} 
1

唐,

你有两个选择。首先,如果你不打算在所有在你的逻辑使用的名称(这似乎是一种选择,因为你已经有唯一的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 
      } 
    } 
} 

前两个规则会匹配“/作者/演出/ 10 /网址dan + brown“以及”/ author/show/10“,您可以通过params.name访问来自show method的参数名称参数。