2010-05-11 21 views
6

Grails, de forma predeterminada, distingue entre mayúsculas y minúsculas al asignar URL a las acciones o vistas del controlador.¿Cómo hacer que mi mapeo de URL no sea sensible?

Por ejemplo, www.mywebsite.com/book/list funcionará PERO www.mywebsite.com/Book/list devolverá una página 404.

¿Qué puedo hacer (los fragmentos de código son bienvenidos) para hacer que mi URL no distinga entre mayúsculas y minúsculas (es decir, que www.mywebsite.com/Book/list sea una URL válida)?

+0

Sólo de pensar, no se puede entonces convertir sus URL en minúsculas antes de usarlos? ¿O no tienes el control de las URL en tu código? –

+0

¡Ese es el punto! Básicamente la pregunta es: ¿Cómo hacer eso en Grails con el archivo UrlMapping.groovy o algo más? – fabien7474

Respuesta

0

Sólo un disparar desde la cadera, pruebe lo siguiente:

static mappings = { 
"/$controller/$action?/$id?"{ 
    controller = controller.toLowerCase() 
    action = action.toLowerCase() 
} 
+0

No funciona: incluso si no, ¡lanza una excepción! – fabien7474

0

Controller es una "palabra clave reservada" hay que cambiar el nombre a algo así como "controllerName"

 
static mappings = { 
"/$controllerName/$action?/$id?"{ 
    controller = {"${params.controllerName}".toLowerCase()} 
    action = action.toLowerCase() 
} 
+0

No, esto da: '' No se puede invocar el método a LowCase() en el objeto nulo''. – confile

+0

¿quieres decir que no sabes cómo manejar una acción que es nula? No dije que no sea obvio –

0

Aaron Saunders tiene como una gran solución aquí, pero su sitio fue bloqueado por mí. Aquí está su fantástica solución. Confirmado que funciona muy bien en Grails 2.x.

import org.codehaus.groovy.grails.commons.GrailsClass 

class UrlMappings { 

    def grailsApplication 

    static mappings = { 
     "/$controller/$action?/$id?"{ 
      constraints { 
       // apply constraints here 
      } 
     } 
     //Case InSeNsItIvE URLS!!! 
     "/$_ctrl/$_action/$id?" { 
      controller = { 

       def foundControllerMatch = false 
       def returnCtrl = params._ctrl 

       grailsApplication.controllerClasses.each { GrailsClass c -> 
        def l_className = c.name.toLowerCase() 

        // find the class 
        if (params._ctrl?.equalsIgnoreCase(l_className) && foundControllerMatch == false) { 
         foundControllerMatch = true 
         returnCtrl = c.getLogicalPropertyName() 
         //println " foundControllerMatch ${returnCtrl}" 
        } 
       } 

       return returnCtrl 
      } 

      action = { 

       def foundActionMatch = false 
       def returnAction = params?._action 
       def returnCtrl = params._ctrl 

       grailsApplication.controllerClasses.each { GrailsClass c -> 
        def l_className = c.name.toLowerCase() 

        // find the class 
        if (params._ctrl?.equalsIgnoreCase(l_className) && foundActionMatch == false) { 

         returnCtrl = c.name 

         c.URIs.each { _uri -> 

          if (foundActionMatch == false) { 
           def uri = _uri 

           //println "u-> $uri" 

           def uri_action 
           uri_action = uri.split('/')[2] 

           //println "uri_action-> $uri_action" 
           if (uri_action?.trim()?.equalsIgnoreCase(params._action.trim())) { 
            foundActionMatch = true 
            returnAction = uri_action 
           } 
          } 
         } 
        } 
       } 

       return returnAction 

      } 

     } 
    } 
} 
0

Aquí es cómo trabaja en Grails 2.4 basado en http://www.clearlyinnovative.com/case-insensitive-url-mappings-in-grails

 "/$_ctrl/$_action/$id?" { 
     controller = { 
      def foundControllerMatch = false 
      def returnCtrl = params._ctrl 

      def grailsApplication = Holders.getGrailsApplication() 


      grailsApplication.controllerClasses.each { GrailsClass c ->; 
       def l_className = c.name.toLowerCase() 

       // find the class 
       if (params._ctrl?.equalsIgnoreCase(l_className) && foundControllerMatch == false) { 
        foundControllerMatch = true 
        returnCtrl = c.getLogicalPropertyName() 
//     println " foundControllerMatch ${returnCtrl}" 
       } 
      } 
      return returnCtrl 
     } 

     action = { 
      def foundActionMatch = false 
      def returnAction = params?._action 
      def returnCtrl = params._ctrl 

      def grailsApplication = Holders.getGrailsApplication() 

      grailsApplication.controllerClasses.each { GrailsClass c ->; 
       def l_className = c.name.toLowerCase() 

       // find the class 
       if (params._ctrl?.equalsIgnoreCase(l_className) && foundActionMatch == false) { 

        returnCtrl = c.name 

        c.URIs.each { _uri ->; 

         if (foundActionMatch == false) { 
          def uri = _uri 

//       println "u-> $uri" 

          def uri_action 
          uri_action = uri.split('/')[2] 

//       println "uri_action-> $uri_action" 
          if (uri_action?.trim()?.equalsIgnoreCase(params._action.trim())) { 
           foundActionMatch = true 
           returnAction = uri_action 
          } 
         } 
        } 
       } 
      } 
      return returnAction 
     } 

     } 
Cuestiones relacionadas