Grails:如何从控制器逻辑返回错误消息(即不是源自域属性验证)?

pet*_*erp 4 error-handling grails controller view

使用域或命令对象验证不能总是合理地检查例如用户输入错误的错误.

例如,在创建"忘记密码"功能时,如果用户输入数据库中不存在的用户名,我希望显示足够的消息.所以控制器动作就是这样的

...
def user = User.find{name==uname}
if(!user) {
    // user not found in db, output error and render view again
    render view: 'forgotPassword'
    return
}
// do reset password stuff
...
Run Code Online (Sandbox Code Playgroud)

如何在<g:hasErros>标记内的视图中显示错误?

flash.message(因为生成的控制器/视图这样做)对我来说似乎不对,因为我不只是显示信息消息,而是一条错误消息.这就是为什么我认为消息应该由<g:hasErros>标签处理并显示为域验证错误.(对于用户来说,它是相同的反馈级别:"由于输入错误而无法工作".

创建@Validateable命令对象似乎也不正确.恕我直言,检查数据库的值实际上不是命令对象中的验证责任?或者是吗?那对我来说似乎有点太复杂了.

那么最好的方法是什么?其他框架(例如检票)提供不同的方法,如error(String msg)info(String msg),其允许容易处理在视图反馈消息.Grails中是否有类似的概念,我还没有找到它?

Bur*_*ith 13

flash只是一个地图,您可以在其中放置任何内容 - 字符串,数字,对象等.这很方便,因为它只持续一个请求,因此它只会暂时污染会话.生成的GSP中的约定是使用message密钥,但它只是一个约定.

如果要存储另一条消息,请将其存储在另一个密钥中:

flash.warning = '...'
Run Code Online (Sandbox Code Playgroud)

要么

flash.error = '...'
Run Code Online (Sandbox Code Playgroud)

并像其他消息一样在GSP中检索它.

  • 实际上,这是我在项目中使用的方法 - 我定义了一个处理`flash.message`,`flash.warning`和`flash.error`的taglib然后我只需要放置`<g:flashMessages />`在我的视图/脚手架模板/布局中. (5认同)