2010-05-11 3 views
6

Grails, по умолчанию, учитывает регистр при сопоставлении URL-адресов с действиями или представлениями контроллера.Как сделать мой код отображения нечувствительным?

Например, www.mywebsite.com/book/list будет работать, но www.mywebsite.com/Book/list вернет страницу 404.

Что мне делать (приветствуются фрагменты кода), чтобы сделать мой URL-адрес нечувствительным к регистру (например, www.mywebsite.com/Book/list - действительным URL-адресом)?

+0

Просто думал, вы не можете затем конвертировать в URLs строчные буквы перед их использованием? Или вы не контролируете URL-адреса вашего кода? –

+0

Вот в чем смысл! В основном возникает вопрос: как это сделать в Grails с файлом UrlMapping.groovy или что-то еще. – fabien7474

ответ

0

Просто стрелять от бедра, попробуйте следующее:

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

Не работает: даже страшно, это исключает! – fabien7474

0

Контроллер является «зарезервированным ключевым словом» вы должны переименовать его в нечто вроде «controllerName»

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

Нет, это дает: '' Невозможно вызвать метод toLowerCase() для нулевого объекта''. – confile

+0

Вы имеете в виду, что не знаете, как обращаться с действием, которое равно null? Я не сказал, что это не проблема –

0

Аарон Сандерс как отличное решение здесь, но его сайт был заблокирован для меня. Вот его фантастическое решение. Подтвердил, что он отлично работает в 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

Вот как я работает на Grails 2.4 на основе 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 
     } 

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