任何已经使用Grails实现类似功能的人都可以告诉我哪些是很好的实践(如果有的话)来创建格式为“http://www.myservice.com/username”的用户个人资料网址,如Facebook,Twitter,Linkedin ?
我正在尝试通过UrlMappings实现它,在我看来,我需要打破代码约定,至少对于控制器而言。
所以,欢迎任何建议,谢谢。
更新1
当我提到我对破坏代码约定的担忧时,我所说的是我想使用这个映射显示用户配置文件,但我在我的应用程序中确实有其他对象我想使用默认访问映射:
"/$controller/$action?/$id?"()
解
感谢我在这里所做的出色贡献,我已经找到了解决我的问题的解决方案。
正如所指出的,要进行这种映射,我需要更密切地控制我的请求的处理方式。这意味着我需要告诉Grails哪些控制器我不想被映射到“用户名”规则。
由于这将是一项非常繁琐的任务(因为我有几个控制器),我这样做是为了自动化它:
UrlMappings.groovy
static mappings = {
getGrailsApplication().controllerClasses.each{ controllerClass ->
"/${controllerClass.logicalPropertyName}/$action?/$id?"(controller: controllerClass.logicalPropertyName)
}
"/$username/$action?"(controller: "user", action: "profile")
}
...
}
当然,我需要在用户注册过程中做类似的事情,以避免用户名等于某个控制器名称。
就是这样,谢谢大家。
答案 0 :(得分:4)
假设您有一个UserController,并且您要将任何domain.com/username映射到用户控制器的show动作,您的URL映射可能是这样的: 在我的例子中,name将成为params中的参数。 有关详细信息,请参阅here
希望这会有所帮助。
static mappings = {
"/$name"(controller: "user", action: "show")
...
}
答案 1 :(得分:1)
根据您的要求,http://yourdomain.com/之后的所有内容都可以是用户名或其他控制器之一,这可能会产生不良影响,具体取决于首先定义的网址映射(例如用户控制器与非用户控制器)。但很可能非用户控制器列表将是较小的列表,因此您应该先放置它并对其进行过滤,然后将所有其他URL映射视为用户映射。
以下是一个例子:
static mapping = {
"/$controller/$action?/$id?" {
constraints {
controller inList: ['nonUserController1', 'nonUserController2',...]
}
}
//this should work for /username and /username/whateveraction
"/$username/$action?"(controller: 'user')
}
有些事情需要注意:
http://yourdomain.com/
之后的其他所有内容都可能是用户名 - 是否正确?