Маршрут Grails UrlMapping к фиксированному контроллеру и действию

Я сделал следующее правило в моем файле 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')
}

Как я могу отобразить это правильно?

3 ответа

Решение

Решена!

Я просто написал некоторый код в UrlMappings, чтобы автоматически создавать правила для каждого контроллера в приложении. Используя этот подход, когда пользователь вводит /appname/controllerName, правило, созданное автоматически, рассматривается вместо правила "$/username".

Критическим моментом является то, что использование ApplicationHolder не рекомендуется. Это можно исправить написанием собственного 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')
}

Возможно, вы также можете исключить пользовательские и usario контроллеры из первых ограничений отображения URL (notEqual)

http://www.grails.org/doc/latest/ref/Constraints/notEqual.html

Просто добавь /users/$username к отображению URL. Это самый простой способ достижения ваших целей.

 "/users/$username" {
        controller = 'user'
        action = 'publicItens'
    }
Другие вопросы по тегам