2013-12-10 51 views
0

我知道这是可以做到这样的事情:如何巢的Grails控制器路径

与动作栏控制器foo就可以通过(1)访问:

/appname/foo/bar 

它可以使用被改写URL映射 - 例如像这样:

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

,然后通过(2)访问:

/appname/foobar/foo/bar 

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

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

但我宁愿不删除这一点,因为这基本上意味着我必须手动写映射到下面的默认模式每隔控制器/行动。

,能够获得URL的模式为特定的控制器/样作用(2)不使用URL映射?如果没有,是否有一种简单的方法可以将控制器从默认映射关闭中“排除”?

+0

我想我明白你在追求什么,蹄。我不认为你可以按照你的意愿来实现它。默认的/ $ controller/$ action/$ id映射必须变为/ /$ action/$ id,其中 =“foo”。这在颈部有点痛苦,但我实际上必须做类似的事情。你的另一个选择是保持默认的Grails规则,并为路径中的某些东西打破该规则所需的前缀。那么, – derdc

+0

。后面的建议 - “你的另一个选择是保持默认的Grails规则,并将所有需要打破该规则的东西都加上前缀” - 你会怎么做?我想保留默认的URL映射,但是对于只能在前缀内访问的某些控制器来分解它。 foo控制器只能通过foobar/foo访问:) – Hoof

+0

我会用一些示例代码发布答案。我完全不了解你的要求,但我会告诉你我的意思。 – derdc

回答

0

如果你可以让你的规则中断情况比Grails默认的$ controller/$ action?$ id更具体吗?模式,那么默认值可以保持原样并适用于异常模式之外的所有内容。我制作了一个快速的Person域,并执行了全部生成。然后我自己做了一个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 /富/计算器”,它会打印出 “违反规章制度富:计算器”。如果你去“/ b”,它会打印“破坏规则索引”。

然后,如果您转到标准Person URI,那么您的所有默认Grails脚手架都能正常工作(创建,编辑等),因为它会映射到典型的“$ controller/$ action?/ $ id?”。模式。

类BreakRuleController {

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

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

}

+0

但我仍然可以去“/ breakRule/**” - 我不能吗?就我所见,以上示例与我的示例(2)完全相同? – Hoof

+0

你可以澄清一下你的问题吗?我不明白你想要达到什么目的。我觉得我有点迷失在foo,bar,foobar中。 – derdc

+0

在您自己的示例中,由于特定的URL映射,可能会到达“/ b/foo/stackoverflow”。然而!它仍然可以转到“/ breakRule/foo/stackoverflow”。后者因为默认映射。我不想避免后者而无需手动编写其他每个URL映射 - 也就是移除默认的一般动态URL映射。得到它? – Hoof

1

解决的办法就是改变默认的映射,在某种程度上排除whished专用控制器的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。而不是错误/ notFound你也可以重定向到其他位置。