#grails #controller #action
#grails #контроллер #Экшен
Вопрос:
Представьте себе этот контроллер:
class exampleController{
def action1 = {}
def action2 = {}
def action3 = {}
def action4 = {}
def action5 = {}
}
Я хочу иметь возможность возвращать во всех действиях в этом контроллере одни и те же параметры. Представляя это:
def user = session.user
[user: user]
Есть ли какой-либо способ сделать это, помимо написания одного и того же кода для всех действий? Параметры возврата session.user — это всего лишь пример. На самом деле я не хочу его возвращать.
Ответ №1:
Простое решение — поместить этот код в метод и вызывать его из каждого действия
class exampleController{
def action1 = {getModel()}
def action2 = {getModel()}
def action3 = {getModel()}
def action4 = {getModel()}
def action5 = {getModel()}
private getModel() {
def user = session.user
[user: user]
}
}
Хотя это требует некоторого количества повторений (вызова одного и того же метода), гораздо более очевидно, что здесь происходит. При отладке / тестировании контроллера легко забыть о фильтрах и перехватчиках, которые часто могут приводить к таким вопросам, как
что за @**% здесь происходит?
Ответ №2:
Используйте фильтр — http://grails.org/doc/latest/guide/6. The Web Layer.html#6.6 Filters — или последующий перехватчик — http://grails.org/doc/latest/guide/6. The Web Layer.html#6.1.5 Controller Interceptors
Ответ №3:
У меня похожий случай, и я модифицировал строительные леса grails для генератора контроллера.
class MyClassController {
def list = {
...
}
def show = {
def eInstance = beanIfExist()
...
}
def edit = {
def eInstance = beanIfExist()
...
}
def update = {
def eInstance = beanIfExist()
...
}
def delete = {
def eInstance = beanIfExist()
...
}
def beanIfExist = {
def beanInstance = MyClass.get(params.id)
if (beanInstance) {
return beanInstance
} else {
flash.message = "Error, invalid record."
redirect(action: "list")
return null
}
}
}
Это мое предложение, теперь, если вам нужен другой, который отправлял данные для просмотра, вы можете использовать перехватчики.