我想设置它,以便当用户使用URL中的电话号码访问应用程序时Grails会将用户定向到指定的配置文件,例如:
localhost:8080/Application/profile/07871216969 -> /user/show/User.findByUserTelephone(07871216969)
或者最好
localhost:8080/Application/07871216969 -> /user/show/User.findByUserTelephone(07871216969)
但是,我不知道在调用findByUserTelephone闭包时如何引用URL中的电话号码;我注意到了这样的事情:
/profile/$telephoneNumber
但是我不完全确定这是怎么回事。
另外,由于/ user / show动作需要参数中的id,我不确定findUserByTelephone闭包是否有用,因为它将User作为对象返回,而我似乎无法使用getId()或者.id要检索id的对象。
已解决/解决方案:
我通过在Controller中创建另一个名为profile
的操作解决了这个问题,然后此操作的代码类似于以下内容:
def profile = {
if(User.findByUserTelephone(params.userTelephone)) {
def userInstance = User.findByUserTelephone(params.userTelephone)
if (!userInstance) {
flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'user.label', default: 'User'), params.id])}"
redirect(action: "list")
}
else {
[userInstance: userInstance]
}
} else {
render("Sorry, that user wasn't found in our database.")
}
}
然后我创建了以下UrlMapping条目:
`"/$userTelephone"(controller: "user", action: "profile")`
因此,当用户在系统中输入电话号码(或/
之后的任何字符串)时,它会将用户路由到用户/个人资料操作,该操作将尝试通过他们的电话号码查找用户。如果成功,将显示用户详细信息,否则将显示错误消息。
答案 0 :(得分:1)
如果你使用与控制器名称不同的url路径,它可能会在以后节省一些麻烦。所以如果你有类似的东西:
"/p/$phoneNumber"(controller:profile, action:show)
您将不会有任何匹配多个URLMapping条目的URL模式,这些模式可能会让您感到有些困惑。我猜这只是:
"/$phoneNumber"(controller:profile, action:show)
会起作用,但我希望最终会遇到Grails被多个匹配相同请求路径的URLMapp混淆的情况,除非你非常小心。