我总是拔出这篇博客时,这个问题来了:
http://mrpaulwoods.wordpress.com/2011/01/23/a-pattern-to-simplify-grails-controllers/
基本上你在你的控制器各个领域的私人助手。
private def withPerson(id="id", Closure c) {
def person = Person.get(params[id])
if(person) {
c.call person
} else {
flash.message = "The person was not found."
redirect action:"list"
}
}
你的代码,吸气的方式是非常灵活,对我来说是典型的使用(即不包括在博客)是一个用于编辑等。
我通常这样的代码(我喜欢它的明确分工和可读性模式):
def editIssue() {
withIssue { Issue issue ->
def issueTypes = IssueTypeEnum.values().collect {it.text }
[issueTypes:issueTypes,activePage:"issue", issue: issue]
}
}
def doEditIssue(IssueCommand cmd) {
if(cmd.validate()) {
withIssue { Issue issue ->
issue.updateIssue(cmd)
redirect(action: "show", id: issue.id)
}
}
else {
def issueTypes = IssueTypeEnum.values().collect {it.text }
render(view: "edit", model:[issueTypes:issueTypes,issue:cmd,activePage:"issue"])
}
}
用我的getter帮手之中:
private def withIssue(Closure c) {
def issue = Issue.get(params.id)
if(issue) {
c.call issue
}
else {
response.sendError(404)
}
}
我确实认为混入方法(非常类似于'扩展通用抽象控制器'的方式)也不错,但是这种方式给出了两个优点:
- 你可以键入帮助程序,就像你看到我在关闭时给你的方法等在STS/IDEA(未测试Netbeans)
- 重复不是很高,并且能够改变getter(用于例如BarDomain.findByFoo(params.id)等)
在我绑定到编辑视图()我只是把在<g:form>
的id="${issue.id}"
和它的作品完美。
请编辑该问题并添加代码示例。目前这个问题非常模糊。 – ordnungswidrig