【问题标题】:Grails - custom Flash.message renderingGrails - 自定义 Flash.message 渲染
【发布时间】:2012-08-01 04:47:55
【问题描述】:

我正在运行查询以检查是否存在多个帐户 ID 的实体 ID。如果结果集不为空,那么我需要抛出错误或显示一条消息。

方法代码如下:

def save() {

    def SAMLInfoInstance = new SAMLInfo(params)

    def account = Account.get(params?.accountId)        
    SAMLInfoInstance.setAccount(account)

    def samlInfoInstanceList = SAMLInfo.executeQuery("from SAMLInfo " +
        " where account.id <> ? " +
           " and entityId =  ?", [SAMLInfoInstance.accountId, SAMLInfoInstance.entityId])

    if (samlInfoInstanceList?.size > 0){
        flash.message = message(code: 'test.not.created.message', args: [message(code: 'SAMLInfo.label', default: 'SAMLInfo'), SAMLInfoInstance.entityId])
        /*flash.message = "default.not.created.message"
        flash.args = ["SAMLInfo", SAMLInfoInstance.entityId]
        flash.default = "SAMLInfo cannot be created"
        */
        render(view: "create", model: [SAMLInfoInstance: SAMLInfoInstance])
        return
        }

    if (!SAMLInfoInstance.save(flush: true)) {
        render(view: "create", model: [SAMLInfoInstance: SAMLInfoInstance])
        return
    }

    flash.message = message(code: 'default.created.message', args: [message(code: 'SAMLInfo.label', default: 'SAMLInfo'), SAMLInfoInstance.entityId])
    redirect(action: "list", id: SAMLInfoInstance.account.id)
}

在我看来,我以以下方式呈现 Flash 消息和错误:

<g:if test="${flash.message}">
        <br/>
        <div class="message" role="status">
        <g:message code="${flash.message}" args="${flash.args}" default="${flash.default}"/>
        </div>
        <br/>
        </g:if>
        <br/>

        <g:renderErrors bean="${SAMLInfoInstance}" as="list" />

在我的 message.properties 文件中,我有以下行:

test.not.created.message=The SP url {1} is not allowed for this account. Please enter a different value.

当我运行此代码时,Flash 消息显示为我作为消息传递的字符串,即“test.not.created.message”。此外,每当我导航到显示 flash.message 的任何其他页面时,都会传递此字符串以显示。 我是 grails 和 groovy 的新手,如果有任何帮助,我将不胜感激。

谢谢!

【问题讨论】:

    标签: grails error-handling grails-orm grails-controller flash-message


    【解决方案1】:

    那么有2个问题:

    1 - 未从您的 message.properties 中检索消息:

    您的项目中必须有其他 message.properties 文件。给它一个检查。因为如果没有找到,grails 会显示代码本身而不是消息,因为它没有找到。也许它正在其他一些属性文件中寻找您的消息,例如特定于您的区域设置的文件(例如:pt_BR 或 en_US)。除此之外,您使用 message(code:...) 构造是正确的。

    2 - 您的闪信不会消失:

    使用 request.message 代替 flash.message。

    【讨论】:

    • 那行得通 :) 我继续使用以下代码解决了我的问题:Obj.errors.rejectValue('entityId', 'Obj.entityId.clash.not.created.message', [message(code: 'Obj.label', default: 'Obj url'), Obj.entityId] as Object [], 'This Obj url is not allowed for this account. Please enter a different value.') 它使用了可以在static.springsource.org/spring/docs/3.0.x/javadoc-api/org/… 找到的方法签名
    • 什么意思?要求快速更改?
    【解决方案2】:

    我认为您要遵循的示例是here

    您只需要在控制器或视图中解析一次消息。

    所以在控制器中:

    flash.message = "test.not.created.message"
    flash.args = ["SAMLInfo"]
    flash.default = "<default text>"
    

    在视图中:

    <g:message code="${flash.message}" args="${flash.args}"
               default="${flash.default}"/>
    

    flash scope is cleared at the end of the next request 可以解释为什么您仍然会在下一页上看到该消息。

    【讨论】:

    • 也许您想指定flash 并执行redirect - 那么该消息将只显示一次。
    • 我尝试做一个redirect,但我收到一个错误,说在此之前已经有一个redirect,因此无法执行。这就是为什么我不得不求助于渲染视图。
    • @Tiago Farias 我的项目中没有其他messages.properties 文件,而且我还没有实现特定于语言环境的消息,因此排除了这两种可能性。
    猜你喜欢
    • 1970-01-01
    • 2018-01-20
    • 2022-01-10
    • 2013-07-27
    • 1970-01-01
    • 2017-06-09
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多