Я всегда вытаскиваю это сообщение в блоге, когда возникает этот вопрос:
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"])
}
}
С моим помощником-получателем:
private def withIssue( Closure c) {
def issue = Issue.get(params.id)
if(issue) {
c.call issue
}
else {
response.sendError(404)
}
}
Я действительно считаю, что метод mixin (очень похож на способ «расширить общий абстрактный контроллер»)) тоже неплохо, но этот способ дает два преимущества:
- Вы можете напечатать помощника, как вы видите в закрытии, что дает вам доступ к методам и т. д. в STS / IDEA (не проверено Netbeans)
- Повторяемость не очень высокая, и возможность менять геттер (использовать, например, BarDomain.findByFoo (params.id) и т. Д.)
В представлении, которое я связываюдля редактирования () я просто положил id="${issue.id}"
в <g:form>
d это работает без проблем.