Grails UrlMapping到固定控制器和操作的路由

Grails UrlMapping到固定控制器和操作的路由,grails,url-mapping,Grails,Url Mapping,我在UrlMapping文件中制定了以下规则,现在我所有的控制器都匹配到(“/$username”)映射,而不是第一个(“/$controller/$action?/$id?”) 这里的想法是使用一个短url列出用户的所有公共项目。它可以工作,但会破坏所有其他控制器 static mappings = { "/$controller/$action?/$id?"{ constraints { // apply constraints here

我在UrlMapping文件中制定了以下规则,现在我所有的控制器都匹配到(
“/$username”
)映射,而不是第一个(
“/$controller/$action?/$id?”

这里的想法是使用一个短url列出用户的所有公共项目。它可以工作,但会破坏所有其他控制器

static mappings = {

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

    "/$username" {
        controller = 'user'
        action = 'publicItens'
    }

    "/"(controller:'usuario', action: 'index' )
    "500"(view:'/error')
}

如何正确映射它?

只需将
/users/$username
添加到URL映射即可。这是实现目标的最简单方法

 "/users/$username" {
        controller = 'user'
        action = 'publicItens'
    }

您可能还可以在第一个url映射约束(notEqual)中排除用户和usario控制器

解决了

我只是在UrlMappings中编写了一些代码,以便为应用程序中的每个控制器自动创建规则。当用户键入/appname/controllerName时,使用这种方法,则会考虑自动创建的规则来代替“$/username”规则

关键的一点是ApplicationHolder的使用已被弃用。这可以修复编写自己的应用程序持有者的问题

static mappings = {

    //creates one mapping rule for each controller in the application
    ApplicationHolder.application.controllerClasses*.logicalPropertyName.each { cName ->
        "/$cName" {
            controller = cName
        }
    }

    "/$controller/$action?/$id?"{
    }

    "/$username" {
        controller = 'usuario'
        action = 'itensPublicos'
    }

    "/"(controller:'usuario', action: 'index' )
    "500"(view:'/error')
}

实际上,我想在不使用控制器名称的情况下映射它。@lfrodrigues那么当
$username
恰好与其中一个控制器名称相同时,您希望发生什么?例如,如果您有一个名为
search
的控制器,但有人将其用户名设置为“search”,该怎么办?grails如何知道选择哪个URL映射?在这种情况下,grails将选择控制器。应修改创建新用户的控制器,以避免注册具有控制器名称的用户。我测试了您的方法,但没有成功。它一直使用“/$username”规则而不是“/$controller/$action?/$id?”。例如:我有一个名为“top”的控制器,当我在地址栏中键入localhost:8080/appname/top时,规则映射到“user”控制器,而不是top控制器。