0

所以我让这个控制器带有一个重置(擦除一些数据)、索引和其他方法,所以在重置方法结束时我有一个重定向到索引方法。和有什么区别:

redirect(action: "index", id: params.id)

redirect(action: index, id: params.id)

第一个完美运行,在 index 方法中重定向我,但第二个将我重定向到不同的方法。(getEndMonthsList这是控制器中的最后一个方法)

4

2 回答 2

2

您展示的两个变体在 Grails 2 之前是有效的,因为只有闭包可以用来定义动作。因此,您可以重定向到“index”,或者index因为您使用第二种方法引用了闭包属性,Grails 将根据其名称构建完整的 URL。它稍微慢一些,所以使用 String 方法总是更好。

在 2.0 中,事情发生了变化,允许将方法用作操作,并且是首选方法。因此,如果你有一个index方法,它就不再是类中的公共字段,你可以像任何其他变量一样引用它,它是一个不能直接通过名称引用的方法。所以字符串方法是唯一有效的方法。

我尝试使用非字符串方法来重现这一点,但它并没有按照您描述的方式失败,当索引操作被定义为方法(如预期的那样)并且在定义时工作正常时,它失败并出现缺少属性异常作为一个闭包(再次,正如预期的那样)。

于 2012-10-03T15:41:23.940 回答
0

在第一种情况下,Grails 按名称调用控制器方法。在第二种情况下,Grails 获取闭包名称并按名称调用控制器方法。

org.codehaus.groovy.grails.web.metaclass.RedirectDynamicMethod#establishActionName

于 2012-10-03T09:02:04.727 回答