Grails Url Mapping Redirect以保持DRY

时间:2012-09-27 02:14:12

标签: grails grails-2.0

我正在使用Grails 2.1.1,并希望添加一些映射到控制器操作的自定义网址。

我可以这样做,但原始映射仍然有效。

例如,我在add-property-to-directory中创建了一个映射UrlMappings,如下所示:

class UrlMappings {

    static mappings = {
        "/add-property-to-directory"(controller: "property", action: "create")
        "/$controller/$action?/$id?"{
            constraints {
                // apply constraints here
            }
        }

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

现在,我可以点击/mysite/add-property-to-directory,它会执行PropertyController.create,正如我所料。

但是,我仍然可以点击/mysite/property/create,它会执行相同的PropertyController.create方法。

本着DRY的精神,我想从/mysite/property/create/mysite/add-property-to-directory进行301重定向。

我找不到在UrlMappings.groovy中执行此操作的方法。有谁知道我可以在Grails中实现这一目标的方式?

非常感谢!

更新

根据Tom的回答,这是我实施的解决方案:

UrlMappings.groovy

class UrlMappings {

    static mappings = {

        "/add-property-to-directory"(controller: "property", action: "create")
        "/property/create" {
            controller = "redirect"
            destination = "/add-property-to-directory"
        }


        "/$controller/$action?/$id?"{
            constraints {
                // apply constraints here
            }
        }

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

RedirectController.groovy

class RedirectController {

    def index() {
        redirect(url: params.destination, permanent: true)
    }
}

2 个答案:

答案 0 :(得分:3)

可以实现这一目标:

"/$controller/$action?/$id?" (
    controller: 'myRedirectControlller', action: 'myRedirectAction', params:[ controller: $controller, action: $action, id: $id ]
)

"/user/list" ( controller:'user', action:'list' )

并且在行动中你得到了params中的值normallny:

log.trace 'myRedirectController.myRedirectAction: ' + params.controller + ', ' + params.action + ', ' + params.id

答案 1 :(得分:0)

从Grails 2.3开始,可以直接在UrlMappings中进行重定向,而无需重定向控制器。因此,如果你升级了,你可以像documentation一样在UrlMappings中重定向:

"/property/create"(redirect: '/add-property-to-directory')

作为原始请求一部分的请求参数将包含在重定向中。