Grails URL映射

Grails URL映射,grails,url-rewriting,seo,Grails,Url Rewriting,Seo,在我的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属性

在我的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
属性


我更喜欢显示作者或书籍的URL使用名称而不是数据库ID来标识书籍/作者,例如
/author/show/shakespeare
/book/show/ulyses
。这是否可以在不更改域类的情况下实现,从而使名称字段成为id(主键)?

您可以将字符串(例如“shakespeare”)作为
参数id传递,然后不执行以下操作:

Author.get(params.id)
在控制器方法中,执行以下操作:

Author.findByName(params.id)

据我所知,
id
参数(与URL一起使用时)不必是
长的

只是用这个做了一个快速测试,它似乎可以工作。转到
http://example.com:8080/myapp/books/show/Book1
并看到它呈现出我的名为“Book1”的自举书籍。诚然,这需要在控制器中进行大量的工作,以便在任何地方进行更改。更改控制器是很容易的一部分-我可能只需要为每个域类修改(一行)单个操作。更困难的部分是跟踪调用该操作的所有位置,并将其更改为发送名称而不是ID。无论如何,似乎没有其他选择,因此您赢得了梦寐以求的复选标记。衷心祝贺你,谢谢你。