Маршрут 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'
}