我想了解更多關於自定義grails控制器的代碼,但我找不到任何文檔。使用grails控制器的自定義腳手架?
具體而言,我的動機是我正在使用遺留數據庫,這是隻讀的。因此,我想定製代碼生成,以便如果某個域類處於某個包中,例如:toppackage.readonly,那麼只生成只讀代碼,而不是控制器上的列表和顯示方法。
我已經玩了一下,我不確定他們究竟是如何解析模板的。它們包含< %%>標籤,並且對語義空白似乎很敏感。
我知道腳手架的設計意圖是給你一個出發點,但往往是這樣的情況,稍後重新審視某件事物,改變和重新生成事物看起來很浪費。也必然存在屬於代碼生成階段的特定項目的約定。在我們的例子中,有一些屬於代碼生成階段的安全要求。
如何在代碼模板中注入變量?
如何評估標籤?這是OGNL的一種形式嗎?
我把一些可怕醜陋的方式,現在做到這一點,通過把域類的包只讀的名稱,這在控制器模板:
<%=!(packageName=~/\readonly/) ? """ def save = {\n
def ${propertyName} = new ${className}(params)\n
if (${propertyName}.save(flush: true)) {\n
flash.message = \"\${message(code: 'default.created.message', args: [message(code: '${domainClass.propertyName}.label', default: '${className}'), ${propertyName}.id])}\"\n
redirect(action: \"show\", id: ${propertyName}.id)\n
}\n
else {\n
render(view: \"create\", model: [${propertyName}: ${propertyName}])\n
}
}""" : ''%>
什麼變量是你想注入?僅供參考...您可以隨時查看GRAILS_HOME/scripts/GenerateController.groovy腳本,瞭解它如何變得神奇。你可以看到它使用DefaultGrailsTemplateGenerator()來結束,以評估模板。 – mlathe