2012-10-10 137 views
2

我有,我用高度定製腳手架模板時beforeUpdate模板方法添加到update,這樣我可以輕鬆地定製腳手架Controller的,而不需要生成,然後分別編輯每個控制器一個Grails項目覆蓋模板方法。在腳手架控制器

不幸的是,這並不工作,只有beforeUpdate從腳手架被調用。 我懷疑它與使用Groovy中注入腳手架代碼到實際Controller代碼生成做的,但我無法找到任何確認。

什麼我問的是無論對問題的解決方案或爲什麼它不工作的解釋。

這裏是腳手架代碼:

def beforeUpdate = { 
    println "beforeUpdate from scaffold" 
} 

def update() { 
    // call before update hook 
    beforeUpdate() 

    def ${propertyName} = ${className}.get(params.id) 
    if (!${propertyName}) { 
     flash.message = message(code: 'default.not.found.message', args: [message(code: '${domainClass.propertyName}.label', default: '${className}'), params.id]) 
     redirect(action: "list") 
     return 
    } 
    [...] 

和腳手架控制器代碼(這不叫,但我相信它應該):

class CalendarController { 
    static scaffold = Calendar 

    def beforeUpdate = { 
      println "beforeUpdate from controller" 
    } 
} 

我已經嘗試Grails的清潔 ;-)

UPDATE

我已經最終意識到,這僅僅是impossibile由於Grails的腳手架是如何設計的。關閉。

+0

「關閉」 這個問題,你應該添加自己的答案,然後標記它被接受。 – madth3

回答

0

我已經最終意識到,這僅僅是impossibile由於Grails的腳手架是如何設計:通過動態複製/創建方法到腳手架控制器,而不是使用繼承。

1

您也有類似的問題this question - 本質上腳手架的方式工作腳手架模板生成一個單獨的類,它的「真實」控制器與會代表。所以如果你想讓生成的控制器調用真正的控制器上的方法,你不能使用this,你需要獲得對真實控制器對象的引用。

爲了削減長話短說,使用

GrailsWebUtil.getControllerFromRequest(request).beforeUpdate() 

,而不是僅僅

beforeUpdate() 

def update() { 
    // call before update hook 
    def realController = GrailsWebUtil.getControllerFromRequest(request) 
    if(realController.hasProperty('beforeUpdate') && 
     realController.beforeUpdate instanceof Closure) { 
     realController.beforeUpdate() 
    } else { 
     this.beforeUpdate() 
    } 

    def ${propertyName} = ${className}.get(params.id) 
    if (!${propertyName}) { 
     flash.message = message(code: 'default.not.found.message', args: [message(code: '${domainClass.propertyName}.label', default: '${className}'), params.id]) 
     redirect(action: "list") 
     return 
    } 
    [...]