2011-03-11 101 views
3

我试图覆盖G:link标签,这样我可以前缀的额外字符串。这里是我的代码:覆盖的Grails G:link标签

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) 
    } 
} 

这工作得很好,除了当我添加“ES /”生成的路径被转换为ES%2F代替ES /这会导致链接无法正常工作。

是否有办法防止这种自动编码新斜线或更好的方式来此前缀字符串到控制器的路径?

+0

也许更好的做法是用反向URL映射做到这一点:http://grails.1312388.n4.nabble.com/i18nize-URLs-how-to-change-urlMappings-getReverseMapping- td3251559.html – Dana 2011-03-11 22:10:28

回答

1

你应该知道,在Grails中的控制器封装(因此它在项目的结构路径位置)不使用默认的URL映射关联 - 结构是扁平的。

所以你添加到控制器名称中的斜杠编码为它否则将形成的URL的一部分(因此,不会映射到控制器)。

也许用于处理不同的区域设置可以更好地放置在控制器反正的逻辑。

+0

嗯..这是有道理的。我的问题是,我试图避免必须更新所有g:link标签以包含“es”前缀。客户需要在非英语区域中使用所有链接。 – ibuck 2011-03-11 22:13:07

1

您可以通过配置UrlMappings.groovy通过Grails的标签生成的所有链接添加这个“/ ES”前缀。如果您使用的是默认之一,Grails生成create-app命令,你可以在你的URL添加“/ ES”是这样的:

class UrlMappings { 

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

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

要了解更多关于URL映射,请参阅Grails guide

问候