Как сделать мой URL-адрес нечувствительным к регистру? - PullRequest
6 голосов
/ 11 мая 2010

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

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

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

Ответы [ 4 ]

0 голосов
/ 30 сентября 2015

Вот как я работаю на 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 
        }

      }
0 голосов
/ 30 апреля 2012

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

static mappings = {
"/$controllerName/$action?/$id?"{
    controller = {"${params.controllerName}".toLowerCase()}
    action = action.toLowerCase()
}
0 голосов
/ 12 декабря 2014

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

Просто выстрел из бедра, попробуйте следующее:

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