Grails:在beforeInterceptor中呈现页面

Grails:在beforeInterceptor中呈现页面,grails,grails-controller,Grails,Grails Controller,在我的一个控制器中,我在beforeInterceptor闭包中编写了一些错误检查代码 if (getUser()?.courses?.size() == 0) { render(view: '/base/errorMessage', model: [errorMessage: "You don't have any courses!"]); return false; } 该呈现调用显示了一个漂亮的程序范围的错误页面 但是,如果我返回false,则不会显示

在我的一个控制器中,我在beforeInterceptor闭包中编写了一些错误检查代码

 if (getUser()?.courses?.size() == 0) {
        render(view: '/base/errorMessage', model: [errorMessage: "You don't have any courses!"]);
        return false;
 }
该呈现调用显示了一个漂亮的程序范围的错误页面

但是,如果我返回false,则不会显示任何内容!如果我返回true,则错误页面显示得很好,但操作仍会执行(不会呈现,但逻辑仍会执行)。这需要重复的错误检查,从而破坏了拦截器的功能

redirect()调用仍然可以正常工作,但将错误显示移动到其他操作会很麻烦。用户将在其URL中看到/app/error/errorMessage,而不是/app/courses,并且可以直接转到错误页面。还有一个问题是如何将信息传递给动作-flash.message?session.var

有更好的办法吗

更新:显然没有这个问题。但是,这需要将逻辑与控制器分离。不是世界末日


我将把这个问题留待讨论,以防我错过了更好的方法。

我建议您看看:您可以将请求重定向到“共享500服务器错误页面”


此外,我认为您可能不知道您可以更改控制器/操作的URL,这也在上面的链接中提到。

我知道这已经有几年了,但我认为这个问题仍然相关

Grails通过使用命令对象和i18n message.properties提供了一种更方便的方法来验证表单输入和返回flash错误消息

本质上,您不需要编写拦截器。您可以在控制器中创建一个命令对象,其中包含提交时希望获得的所有表单字段。然后为每个字段创建验证约束,并为约束冲突错误创建i18n消息

现在,定义控制器动作并将命令对象作为参数插入时:

def someAction(MyCommandObject command) {}
command对象参数的作用有点像beforeInterceptor,因为Grails会自动将表单submit中的数据绑定到command对象的匹配属性中——但请稍候!还不止这些!Grails还将约束应用于表单中的数据,并在操作中执行任何代码之前运行
command.validate()
all。这就是为什么在执行操作中的任何其他代码之前检查命令对象实例是否存在错误是一种好的、常见的做法,如:

def someAction(MyCommandObject command) {
    if(command.hasErrors()){
        //do something -- set flash message error and redirect, etc.
    }
    //other importand code follows ...
}

我希望这有助于其他可能认为这个问题相关的人。这只是一个示例,说明了命令对象是多么有用和强大。

这并没有真正帮助我-我只是试图截获一个控制器并向用户显示一条消息。这不是一个真正的例外。
def someAction(MyCommandObject command) {
    if(command.hasErrors()){
        //do something -- set flash message error and redirect, etc.
    }
    //other importand code follows ...
}