【问题标题】:working with custom scaffolding for grails controllers?为 grails 控制器使用自定义脚手架?
【发布时间】: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


【解决方案1】:

以下应该有效:

执行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 或转义"${..},除非您想在结果中生成这些内容(如消息)。

简而言之:

  • &lt;% .. %&gt; 之外的所有内容都会打印到结果中
  • &lt;% .. %&gt; 中的所有内容都会在搭建脚手架期间进行评估
  • ${..} 中的所有变量在&lt;% .. %&gt; 之外时都会得到解析
  • 所有变量在 &lt;% .. %&gt; 内时都会得到解析,不需要 ${..}
  • 当您想让变量生成为变量而不是解析值时,需要对其进行转义 (\${..})

【讨论】:

    猜你喜欢
    • 2012-10-25
    • 2020-05-16
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2010-10-24
    • 2014-06-30
    相关资源
    最近更新 更多