2012-02-17 79 views
1

「之後」 我有一個標準的grails(1.3.7)腳手架控制器節省閉合如下:訪問從Grails的重定向ID過濾器

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,而不必爲每個控制器添加任何額外/特殊代碼?

回答

1

按照splix的建議將它保存在請求中,或者考慮使用攔截器。在'afterInterceptor'中,您可以直接訪問模型。看到Controller Interceptors

根據您的意見更新 ,你可以使用元編程技術和攔截域類每個「afterInsert」呼叫。例如,如果你在你的引導補充一點:

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

,你應該能夠訪問所有新創建的域對象和執行常見操作。

+0

我已經更新了我的問題 - 我想對所有控制器中新創建的實體(即更新搜索索引)進行一些處理。換句話說,我需要訪問模型,但都是在上下文中使用更多的過濾器,因爲它需要應用於所有控制器。 – 2012-02-22 00:47:12

+0

非常感謝Aldrin。 – 2012-02-22 23:20:28

3

你可以把它變成request,像

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

,並獲得在過濾器

def id = request.getAttribute('CREATED_ID') 

更新:

或者你也把它放到請求中beforeInsert事件,或者在你自己的活動中聽衆:http://grails.org/doc/latest/guide/GORM.html#eventsAutoTimestamping

+0

這個答案對我的原始問題是正確的,但是自從我更新了問題後,我發現我的問題還不夠具體。 – 2012-02-22 00:44:41

+0

好的,我已經更新了我的答案 – 2012-02-22 06:42:24

+0

感謝您的答案,但如果我理解正確,更新中的解決方案將問題從定製每個控制器轉換爲「定製」每個域類。事情是,這個id被傳遞給重定向,例如「重定向(action:」show「,id:instance.id)」,在每個腳手架控制器中 - 是否可以通過過濾器以某種方式訪問​​?這將意味着控制器/域類中的編碼和混亂最少。 – 2012-02-22 23:16:23