【发布时间】:2012-01-18 15:01:02
【问题描述】:
我想了解有关自定义 grails 控制器生成的更多信息,但我找不到任何文档。
特别是我的动机是我正在使用旧数据库,这是只读的。所以我想自定义代码生成,如果域类在某个包中,例如:toppackage.readonly,那么只会生成只读代码,只有控制器上的 list 和 show 方法。
我对它进行了一些尝试,但我不确定它们是如何解析模板的。它们包含 标记并且似乎对语义空白很敏感。
我知道脚手架的设计意图是为您提供一个起点,但通常情况下,稍后会重新访问并更改某些内容,并且再次重新生成内容似乎很浪费。也必然会有属于代码生成阶段的特定于项目的约定。在我们的案例中,有一些属于代码生成阶段的安全要求。
如何将变量注入代码模板?
如何评估标签?它是 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() 来评估模板。
标签: grails groovy code-generation metaprogramming