1

我正在 Grails (1.3.7) 中开发一个基于组的 Web 应用程序,我拥有的字段之一是我的 Group 域的 groupUrl。它背后的理论是我想让用户能够浏览到http://www.myapp.com/ {userDefinedgroupUrl}

我也希望能够拥有 www.myapp.com/{userDefinedGroupUrl}/$action?/$id? 但是,按照我现在实现的方式,我还必须在映射中对所有其他控制器进行硬编码,以便它们首先匹配并正确执行。

现在,我正在使用类似的东西

mappings = { 
    "/group/$action?/$id?"(controller:"group")
    "/user/$action?/$id?"(controller: "user")
    etc..
    "/$groupUrl?/$action?/$id?"(controller: "group")
    "/$groupUrl?/events/$action?/id?"(controller: "groupEvents")
}

我认为它现在实际上正在运行(我还没有对它进行过彻底的测试),但我想知道是否有更好、更有效的方法来实现这一点。

任何意见,将不胜感激。

谢谢。

4

1 回答 1

4

首先,最好将所有组放在一个子路径下,这样可以更轻松地管理控制器,如下所示:

mappings = { 
    "/$controller/$action?/$id?"()
    "/g/$groupUrl?/$action?/$id?"(controller: "group")
    "/g/$groupUrl?/events/$action?/id?"(controller: "groupEvents")
}

其次,Grails URL 映射允许动态控制器和动作,因此您可以使用一些代码来选择正确的控制器,如下所示:

mappings = { 
    "/$controller/$action?/$id?"()
    "/g/$groupUrl/$group_c?/$action?/$id?" {
        controller = {
            (params.group_c in [null, '', 'group']) ?
                'group' :
                'group' + params.group_c.capitalize()
        }

    }
}

这并不完美,但基本上它允许以下 URL:

  • /g/mygroup/ -> GroupController.index
  • /g/mygroup/group/view/45 -> GroupController.view
  • /g/mygroup/event/list/64 -> GroupEventController.list

但是,它不允许在没有路径GroupController的情况下表示动作。/group/您可以通过在 上硬编码动作列表来解决此问题,GroupController如果group_c在该列表中,则撞到和撞到。那会有点丑。group_cactionactionid

于 2011-09-22T02:45:36.410 回答