【问题标题】:Accessing redirect id from grails "after" filter从 grails “after”过滤器访问重定向 id
【发布时间】:2012-02-17 04:27:13
【问题描述】:

我有一个标准的 grails (1.3.7) 脚手架控制器保存关闭如下:

    def save = {

        // ... instantiate and save "instance" ...

        redirect(action: "show", id: instance.id)
    }

... 和一个“之后”过滤器,例如:

        def filters = 
{
    save(controller:'*', action:'save')
    {
        after =
        {
            // How do I get the newly created entity's ID here?     
        }
    }

有没有办法在任何控制器的过滤器中访问新实体的 ID,而无需向每个控制器添加任何额外/特殊代码?

【问题讨论】:

    标签: grails redirect filter


    【解决方案1】:

    你可以把它放入request,喜欢

    request.setAttribute('CREATED_ID', instance.id)
    

    并在过滤器中获取

    def id = request.getAttribute('CREATED_ID')
    

    更新:

    或者您也可以在beforeInsert 事件或您自己的事件侦听器中将其放入请求中:http://grails.org/doc/latest/guide/GORM.html#eventsAutoTimestamping

    【讨论】:

    • 这个答案对我原来的问题是正确的,但是我在审查并发布我的问题不够具体后更新了这个问题。
    • 感谢您的回答,但如果我理解正确,您更新中的解决方案会将问题从自定义每个控制器转移到“自定义”每个域类。问题是,id 被传递给重定向,例如“redirect(action:“show”,id:instance.id)”,在每个脚手架控制器中 - 这是否可以从过滤器后以某种方式访问​​?这意味着控制器/域类中的编码和混乱最少。
    • 您可以为所有域创建 一个 事件侦听器。见链接
    • 即使在普通的旧休眠模式中。我说的是休眠事件侦听器。我看到这个 dsl 只在 grails 2.0 中引入,但你总是可以直接使用它。请参阅 hbernate 文档:docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html
    【解决方案2】:

    按照 splix 的建议将其保存在请求中,或者考虑改用拦截器。在“afterInterceptor”中,您可以直接访问模型。见Controller Interceptors

    更新 根据您的 cmets,您可以使用元编程技术并拦截域类上的每个“afterInsert”调用。例如,如果你在 Bootstrap 中添加这个:

    grailsApplication.domainClasses.each { org.codehaus.groovy.grails.commons.GrailsDomainClass gc ->
        gc.metaClass.afterInsert = {
            println "$id"
        }
    }
    

    您应该能够访问所有新创建的域对象并执行常见操作。

    【讨论】:

    • 我已经更新了我的问题 - 我想对所有控制器中新创建的实体(即更新搜索索引)进行一些处理。换句话说,我需要访问模型,但都是在更像过滤器的上下文中进行的,因为它需要应用于所有控制器。
    猜你喜欢
    • 2017-09-20
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 2011-01-12
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多