我有一个标准的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,而无需向每个控制器添加任何额外/特殊代码?
答案 0 :(得分:3)
您可以将其放入request
,例如
request.setAttribute('CREATED_ID', instance.id)
并以
作为过滤器def id = request.getAttribute('CREATED_ID')
更新
或者您也可以在beforeInsert
活动或您自己的活动听众处提出要求:http://grails.org/doc/latest/guide/GORM.html#eventsAutoTimestamping
答案 1 :(得分:1)
按照splix的建议将其保存在请求中,或者考虑使用拦截器。在'afterInterceptor'中,您可以直接访问模型。见Controller Interceptors
<强>更新强> 根据您的评论,您可以使用元编程技术并拦截对域类的每个'afterInsert'调用。例如,如果您在Bootstrap中添加它:
grailsApplication.domainClasses.each { org.codehaus.groovy.grails.commons.GrailsDomainClass gc ->
gc.metaClass.afterInsert = {
println "$id"
}
}
您应该能够访问所有新创建的域对象并执行常见操作。