ibuck
ibuck

Reputation: 495

override grails g:link tag

I am trying to override the g:link tag so that I can prefix an extra string. Here is my code:

import org.codehaus.groovy.grails.plugins.web.taglib.*

class ApplicationTagLib {

    static namespace = "g"

    def link = { attrs, body ->
        if("es".equalsIgnoreCase(request.stLocale.language)) {
            attrs['controller'] = "es/" + attrs['controller']
        }
        def applicationTagLib = grailsApplication.mainContext.getBean('org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib')
        applicationTagLib.link.call(attrs, body)
    }
}

This works fine except for when I add "es/" the resulting path gets translated into es%2F instead of es/ which causes the link to not work.

Is there a way to prevent this from automatically encoding the new slash or a better way to prefix this string to the controller path?

Upvotes: 3

Views: 1550

Answers (2)

deluan
deluan

Reputation: 1865

You can add this '/es' prefix in all links generated by grails tags by configuring your UrlMappings.groovy. If you're using the default one, generated by grails create-app command, you can add '/es' in your URL's like this:

class UrlMappings {

    static mappings = {
        "/es/$controller/$action?/$id?" {  // <---------- added '/es' prefix
            constraints {
                // apply constraints here
            }
        }

        "/"(view: "/index")
        "500"(view: '/error')
    }
}

To learn more about URL Mappings, see the Grails guide.

Regards

Upvotes: 1

mfloryan
mfloryan

Reputation: 7685

You should be aware that in Grails the controller package (thus it's location in the project's structure path) does not correlate with the default URL mapping - the structure is flattened.

The slash you add to the controller name is thus encoded as it would otherwise form a part of the URL (and thus not map to a controller).

Perhaps the logic for handling different locale be better placed in a controller anyway.

Upvotes: 1

Related Questions