gpt4 book ai didi

grails - 让 Grails Controller 更加 DRY?

转载 作者:行者123 更新时间:2023-12-02 00:46:18 29 4
gpt4 key购买 nike

我正在寻找清理 Grails Controller 代码的方法。在各种 Controller 中我或多或少有相同的逻辑..

  • 获取对象
  • 检查是否存在
  • 等等..

是否有建议的方法可以使 Controller 操作重用通用代码?

---解决方案---

该问题的所有答案都有助于我们实现的解决方案。

我们使用 Mixin 方法创建了一个在 Controller 中使用的类。 mixin 公开的方法之一是 withObject 方法。此方法从 Controller 获取域名并将其用作该方法的基础。当然可以覆盖此行为!

def withObject(object=this.getClass().getName()-"Controller", id="id", Closure c) {
assert object
def obj = grailsApplication.classLoader.loadClass(object).get(params[id])
if(obj) {
c.call obj
} else {
flash.message = "The object was not found"
redirect action: "list"
}
}

所以所有答案都有助于解决问题!非常感谢!

最佳答案

当出现这个问题时,我总是拿出这篇博文:

http://mrpaulwoods.wordpress.com/2011/01/23/a-pattern-to-simplify-grails-controllers/

基本上,您的 Controller 中的各个域都有一个私有(private)助手。

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"
}
}

对 getter 进行编码的方式非常灵活,对我来说典型用途(博客中未介绍)是用于编辑等。

我通常这样编码(我喜欢这种模式,因为它的清晰划分和可读性):

 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)
}
}

我确实认为 mixin 方法(与“扩展公共(public)抽象 Controller ”方式非常相似)也很好,但这种方式有两个优点:

  1. 您可以输入帮助程序,就像您在闭包中看到的那样,让您可以访问 STS/IDEA 中的方法等(未测试 Netbeans)
  2. 重复率不是很高,并且可以更改 getter(例如使用 BarDomain.findByFoo(params.id) 等)

在我绑定(bind)到 edit() 的 View 中,我只是放置了 id="${issue.id}"<g:form>并且它可以无缝运行。

关于grails - 让 Grails Controller 更加 DRY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8266402/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com