在Grails应用程序中创建“漂亮”的用户配置文件URL

时间:2013-04-10 13:16:44

标签: grails seo url-mapping

任何已经使用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")
     }
     ...
 }

当然,我需要在用户注册过程中做类似的事情,以避免用户名等于某个控制器名称。

就是这样,谢谢大家。

2 个答案:

答案 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/之后的其他所有内容都可能是用户名 - 是否正确?
  • 第二,你需要设置一个约束来捕获所有非用户控制器,而忽略用户url映射
  • 您还需要阻止用户使用与您的某个非用户控制器匹配的用户名进行注册