I was creating some REST web services and I needed to map a URL like
“/api/1.0/recipes” to a controller called RecipesRestController. It took
me a while to work out how to generate a dynamic controller name from
the request path. The trick is not to use $controller, it doesn’t seem
to work, so instead I renamed it $aController.
class UrlMappings { static mappings = { "/$controller/$action?/$id?"{ constraints { // apply constraints here } } "/"(view:"/index") "500"(view:'/error') "/api/1.0/$aController"{ controller={"${params.aController}Rest"} action=[GET:"list", POST:"save"] } "/api/1.0/$aController/$id"{ controller={"${params.aController}Rest"} action=[GET:"show", PUT:"update", DELETE:"delete"] } }}
OR
import org.codehaus.groovy.grails.commons.ApplicationHolder
class UrlMappings {
static mappings = {
for( controllerClass in ApplicationHolder.application.controllerClasses) {
// Admin Controllers first
if( controllerClass.name.startsWith("Admin")){
// note... fixes the case so that AdminUserController maps to /admin/user
"/admin/${controllerClass.name[5].toLowerCase() + controllerClass.name[6..-1]}/$action?/$id?" {
controller = "admin${controllerClass.name[5..-1]}".toString()
}
}
}
}
}
OR
"/admin/$controller/$action?/$id?"{
controller = {
def controllerName = (request.requestURI - request.contextPath).split('/')[2]
// or
//def controllerName = request.servletPath.split('/')[2]
"${controllerName}Admin"
}
}