2013-06-06 2 views
0

В моем файле UrlMapping я сделал следующее правило, и теперь все мои контроллеры соответствуют сопоставлению ("/$username"), а не первому ("/$controller/$action?/$id?").Grails UrlMapping route to fixed controller and action

Идея состояла в том, чтобы перечислить все публичные элементы пользователя, используя короткий URL-адрес. Он работает, но он ломает всех остальных контроллеров.

static mappings = { 

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

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

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

Как правильно его сопоставить?

ответ

1

решаемые!

Я просто написал код в UrlMappings для автоматического создания правил для каждого контроллера в приложении. Используя этот подход, когда пользователь вводит имя/имя приложения/имя_контроллера, автоматически создается правило, созданное автоматически вместо правила «$/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') 
} 
0

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

"https://stackoverflow.com/users/$username" { 
     controller = 'user' 
     action = 'publicItens' 
    } 
+0

На самом деле, я бы хотел отобразить его без имени контроллера. – lfrodrigues

+0

@lfrodrigues, так что вы хотите, когда '$ username' окажется таким же, как одно из имен контроллеров? Например, что, если у вас есть контроллер с именем 'search', но кто-то устанавливает свое имя пользователя для« поиска »? Как grails узнает, какое URL-адрес отображает? – GreenGiant

+0

В этом случае грайлы выберут контроллер. Контроллер, который создает новых пользователей, должен быть изменен, чтобы избежать регистрации пользователя с именем контроллера. – lfrodrigues

0

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

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

+0

Я проверил ваш подход, но я не имел успеха. Он использует правило «/ $ username» вместо «/ $ controller/$ action?/$ Id?». Пример: у меня есть контроллер с именем «top», и когда я набираю localhost: 8080/appname/top в адресной строке, правило сопоставляет с «пользовательским» контроллером вместо верхнего контроллера. – lfrodrigues

Смежные вопросы