如何嵌套Grails控制器路径

时间:2013-12-10 13:40:58

标签: grails url-mapping

我知道可以这样做:

带有操作栏的控制器foo可以通过(1):

访问
/appname/foo/bar

可以使用URL映射重写它 - 例如:

"/foobar/foo/$action"(controller: "foo")

然后通过(2)访问它:

/appname/foobar/foo/bar

但仍然可以通过(1)访问它。这当然是因为默认的URL映射:

"/$controller/$action?/$id?"()

但我宁愿不删除它,因为这基本上意味着我必须手动将映射写入遵循默认模式的每个其他控制器/操作。

可以在不使用URL映射的情况下获取特定控制器/操作(如(2))的url模式?如果没有,是否有一种简单的方法可以从默认的映射闭包中“排除”控制器?

2 个答案:

答案 0 :(得分:1)

解决方案是更改默认映射,以排除提示的特殊控制器URL。

class UrlMappings {

  static myExcludes = ["foo"]

  static mappings = {
    "/foobar/foo/$action"(controller: "foo") // your special Mapping

    // the rewritten default mapping rule
    "/$aController/$aAction?/$id?"{ 
        controller = { (params.aController in UrlMappings.myExcludes) ? "error" : params.aController }
        action = { (params.aController in UrlMappings.myExcludes) ? "notFound" : params.aAction }
        constraints {
            // apply constraints here
        } 
     }
  }
}

对于重写的默认规则,您必须阻止使用默认变量名$ controller和$ action。而不是error / notFound,您也可以重定向到其他位置。

答案 1 :(得分:0)

如果您可以使规则中断方案比Grails默认的$ controller / $ action更具体?$ id?模式,然后默认可以保留原样,并将应用于异常模式之外的所有内容。我创建了一个快速的Person域并执行了一个generate-all。然后我就自己制作了一个BreakRuleController。

class UrlMappings {

static mappings = {

    "/b/$action?/$someVariable?"(controller: "breakRule")

    "/$controller/$action?/$id?(.${format})?"{
        constraints {
            // apply constraints here
        }
    }

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

}

使用此UrlMapping,如果您访问URI“/ b / foo / stackoverflow”,它将打印“Breaking Rules foo:stackoverflow”。如果你转到“/ b”,它将打印“Breaking Rules index”。

然后,如果你去标准的Person URI,所有你默认的Grails脚手架也可以正常工作(创建,编辑等)因为它被映射到典型的“$ controller / $ action?/ $ id?”图案。

  

class BreakRuleController {

   def index() {
       print "Breaking Rules index"
   }

   def foo(String someVariable) {
       print "Breaking Rules foo: " + someVariable
   } 
     

}