grails - 显示flash消息

时间:2013-01-11 11:59:19

标签: grails

我是Grails的新手,我有一个问题对大多数人来说应该很容易。

我有一个显示object列表的页面。如果删除DataIntegrityViolation时有object,我想显示一条消息。我正在做的是:

def delete() {

    def instanceToDelete= Myobject.get(params.id)
    try {
        instanceToDelete.delete(flush: true)
        redirect(action: "list", id: params.id)
    }
    catch (DataIntegrityViolationException e) {
        flash.message = "some message"
        //I want to refresh the div containing the flash.message here
    }
}

以下是应显示flash消息的位置:

  <g:if test="${flash.message}">
  <div class="alert alert-error" style="display: block">${flash.message}</div>

抱歉 - 我知道这是一个愚蠢的问题,但我真的找不到解决方案。

4 个答案:

答案 0 :(得分:19)

flash对象是存储键/值对的Map,因此您可以为错误消息定义自己的密钥。例如:

try {
    instanceToDelete.delete(flush: true)            
    flash.message = "successfully deleted object"
 }
 catch (DataIntegrityViolationException e) {
    flash.error = "could not delete object"            
 }
redirect(action: "list", id: params.id)

然后你可以检查包含flash密钥的error对象,并为这种消息使用不同的样式:

<g:if test="${flash.error}">
  <div class="alert alert-error" style="display: block">${flash.error}</div>
</g:if>
<g:if test="${flash.message}">
  <div class="message" style="display: block">${flash.message}</div>
</g:if>

答案 1 :(得分:3)

这可以帮到你:

def delete() {
    def instanceToDelete= Myobject.get(params.id)
    try {
        instanceToDelete.delete(flush: true)
        flash.success = "Object deleted correctly"
    } catch (DataIntegrityViolationException e) {
        flash.error = "Something goes wrong"
    }
    redirect(action: "list", id: params.id)
}

在所有代码之后重定向到gsp,如果出现错误或一切顺利,可以存储。

您可以将消息放在不同的变量中,以区分错误和成功。

<g:if test="${flash.success}">
    <div class="alert alert-success" style="display: block">${flash.success}</div>
</g:if>
<g:if test="${flash.error}">
    <div class="alert alert-error" style="display: block">${flash.error}</div>
</g:if>

答案 2 :(得分:1)

严格答案:只需返回您的消息(或使用模型地图渲染)

为您的控制器:

def delete() {

    def instanceToDelete= Myobject.get(params.id)
    try {
        instanceToDelete.delete(flush: true)
        redirect(action: "list", id: params.id)
    }
    catch (DataIntegrityViolationException e) {
        render view:'delete', model:[message: "some message"]
        //I want to refresh the div containing the flash.message here
    }
}

为你的gsp:

<g:if test="${message}">
    <div class="alert alert-error" style="display: block">${message}</div>

但是Gregg是对的,你应该从不修改没有redirect的客户数据。 如果这样做,用户可能会刷新(或返回)相同的URL,并意外再次尝试相同的操作。你应该在hitt5的答案中真的喜欢。

答案 3 :(得分:0)

// backend code example

def save () { 
    if(params.name) { 
          . 
          . 
      object.save(); 
      flash.message =  "Saved successfully" 
    } 
    else { 
        flash.message = "Saved fail"
    }

// HTML example

<g:if test="${flash.message}">
   <div class="update_message" role="status">${flash.message}</div>
</g:if>