0

我正在使用 Grails 2.2.0 来建立一个网站,并且我正在寻找关于保持我的代码 DRY 的最佳实践/建议。这是我第一次使用 Grails,我对 Groovy 和 Grails 都有一定的了解,但无论如何我都不是专家。我确实来自 Java+Spring 背景。

我有虚 URL 作为要求。本质上,URI 被用作查找所需模型的键。如果找不到,请重定向到主页。如果确实存在,它将在控制器操作的帮助程序中使用(由闭包指示,仅在存在时执行)。这是我当前(工作)来源的经过消毒的示例:

UrlMappings.groovy:

"/$groupName/dashboard"(controller: "dashboard", action: "viewAll")
"/$groupName/dashboard/create"(controller: "dashboard", action: "createRecord")
"/$groupName/foo/$action?"(controller: "foo")

BaseController.groovy:

Group requireGroupFromUrl(Closure c) {
  if (params.groupName == null) {
    redirect(controller: "home", action: "index")
    return
  }
  else {
    Group group = Group.findByUrlName(params.groupName)
    if (group == null) {
      redirect(controller: "home", action: "index")
      return
    }

    c.call(group)
  }
}

DashboardController.groovy 扩展了 BaseController:

def viewAll() {
  requireGroupFromUrl({ Group group -> gymHelper(group)})
}

def viewAllHelper(Group group) {

  // some logic involving 'group'

  def map = [groupInstance: group, /* OTHER CALCULATED/QUERIED PARAMS*/ ]
  render(view: "/groupView", model: map)
}

这行得通。然而,似乎对辅助方法的需求很笨拙。

乍一看,过滤器似乎可以完成这项工作,但是我需要指定要从过滤器中排除哪些路径(/、/login、/register 等),这似乎使其与网址映射。或者我可以uri以某种方式使用多种模式?例如uri: '*/dashboard/**, */foo/**'?如何继续传递检索到的对象?

这是否可以通过使用仅注释适用控制器操作的周围建议的注释来更好地实现?如果是这样,Aspect 可以调用redirect吗?如何将检索到的对象传递给带注释的控制器操作?IE

@GroupRequired
def viewAll() {
  ...
}
4

1 回答 1

2

控制器beforeInterceptor可以干净地完成此任务:

abstract class BaseController {
    def beforeInterceptor = {
        if (params.groupName == null) {
            redirect(controller: "home", action: "index")
            return false
        }

        Group group = Group.findByUrlName(params.groupName)
        if (group == null) {
            redirect(controller: "home", action: "index")
            return false
        }

        // put the group into the params object
        // for use in the controllers
        params.group = group
    }
}

class ChildController extends BaseController {
    def myAction() {
        Group g = params.group

        // do things
    }
}
于 2013-04-16T15:02:08.703 回答