Grails UrlMappings用于电话号码

时间:2011-09-19 13:54:17

标签: model-view-controller grails groovy

我想设置它,以便当用户使用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")`

因此,当用户在系统中输入电话号码(或/之后的任何字符串)时,它会将用户路由到用户/个人资料操作,该操作将尝试通过他们的电话号码查找用户。如果成功,将显示用户详细信息,否则将显示错误消息。

1 个答案:

答案 0 :(得分:1)

如果你使用与控制器名称不同的url路径,它可能会在以后节省一些麻烦。所以如果你有类似的东西:

"/p/$phoneNumber"(controller:profile, action:show)

您将不会有任何匹配多个URLMapping条目的URL模式,这些模式可能会让您感到有些困惑。我猜这只是:

"/$phoneNumber"(controller:profile, action:show)

会起作用,但我希望最终会遇到Grails被多个匹配相同请求路径的URLMapp混淆的情况,除非你非常小心。