2011-12-12 36 views
3

我想了解更多關於自定義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 
     } 
    }""" : ''%> 
+1

什麼變量是你想注入?僅供參考...您可以隨時查看GRAILS_HOME/scripts/GenerateController.groovy腳本,瞭解它如何變得神奇。你可以看到它使用DefaultGrailsTemplateGenerator()來結束,以評估模板。 – mlathe

回答

2

下面應該工作:

執行grails install-templates安裝模板,對其進行修改(http://grails.org/doc/1.3.7/ref/Command%20Line/install-templates.html

<% if (!packageName.contains("readonly")) { %> 
    def save = { 
     def ${propertyName} = new ${className}(params) 
     if (${propertyName}.save(flush: true)) { 
      flash.message = "\${message(code: 'default.created.message', args: [message(code: '${domainClass.propertyName}.label', default: '${className}'), ${propertyName}.id])}" 
      redirect(action: "show", id: ${propertyName}.id) 
     } 
     else { 
      render(view: "create", model: [${propertyName}: ${propertyName}]) 
     } 
    } 
<% } %> 

您不必添加\n或轉義"${..},除非你想在結果中生成這些東西(如消息)。

要長話短說:

  • <% .. %>外一切都被印入結果
  • <% .. %>內的所有內容獲取${..}腳手架
  • 所有變量中計算得到解決時,外面的<% .. %>
  • 所有變量都在<% .. %>內部得到解決,不需要${..}
  • 變量需要進行轉義,當你想要讓它們生成的變量而不是解析值(\${..}